我正在用C编写一个简单的函数,它应该从字符串“abc”构建一个char数组,所以它应该构建{a',b',C}并返回一个指向该数组的指针。以下是此函数的代码:

char * makeArr()
{
    static char arr[3];

    sprintf(arr, "%s\n", "abc");

    return arr;
}

当我在main中调用此方法时出现问题:
int main(int argc, char *argv[])
{
    char *arr[3];

    arr = makeArr();

    return 0;
}

编译器抱怨类型转换/冲突。我已经玩了很长一段时间的指针,投和解引用,但似乎无法让它工作。请让我知道我的逻辑错在哪里。

最佳答案

隐马尔可夫模型。。。这段代码中有几个错误。让我们从编译器最明显的抱怨开始:

char *arr[3];

这一行声明arr是指向char的三个指针的数组。从函数返回的是指向char->的单个指针不匹配。
下一步:
static char arr[3];
sprintf(arr, "%s\n", "abc")

这里您保留3chars.sprintf()将写入5chars.%s替换为字符串文本"abc"中的3个字符。添加一个换行符,然后添加一个0作为“字符串”结尾的标记。5分。这个btw是未定义的行为。你写过数组的末尾。这样的代码可以编译,但根本不能保证在运行时会发生什么。
在这里切伤口。你应该阅读C语言中的数组和指针。如果你阅读的文本声称它们是相同的。。。停下来,找一个更好的文本。他们不是。
我在这里试着简单解释一下,这样才适合问答风格。
C中的数组实际上是多个值的连续空间。char arr[3]表示一个变量,它包含3chars。
另一方面,achar *只是指向achar的指针——这可能是数组的第一个元素。
在C语言中,不能将数组作为函数参数传递,也不能从函数返回数组。尝试这样做会导致隐式转换:实际传递的是指向该数组第一个元素的指针。
我认为缺少的最后一点信息是C中的字符串文字:它是一个数组(匿名的,例如,它没有名称),包含双引号中的所有字符以及附加的a00标记C中“字符串”的结尾。
在表达式中,字符串文本的计算结果是指向第一个元素的指针。
所以,就像这样:
char *foo = "bar";

将导致指向数组的foob。就像写作一样
static const char no_name_0[] = { 'b', 'a', 'r', 0 };
char *foo = &(no_name_0[0]);

07-28 01:56
查看更多