我在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;
}
编译器抱怨转换/冲突类型。我现在已经玩指针,投射和解除引用了很长一段时间,但似乎无法让它发挥作用。请告诉我逻辑错误的地方。
答案 0 :(得分:2)
除此之外,你感到困惑:
char arr[3]; // array of 3 chars.
和
char *arr[3]; // array of 3 pointers to char.
在main()中,您应该只写char *arr;
答案 1 :(得分:2)
嗯......此代码中有几个错误。让我们从编译器抱怨的最明显的开始:
char *arr[3];
此行声明arr
是一个包含三个指针到char
的数组。从函数返回的是指向char
- >的单个指针。不匹配。
下一步:
static char arr[3];
sprintf(arr, "%s\n", "abc")
在这里预订3 char
s。 sprintf()
会写5 char
。 {em>字符串文字 %s
中的3个字符替换"abc"
。您添加换行符,然后添加0
作为"字符串"结尾的标记。制作5.这个btw是未定义的行为。你写过数组的末尾。像这样的代码可以编译,但是根本不保证在运行时会发生什么。
在此处执行剪切。您应该阅读C中的数组和指针。如果您正在阅读的文本声称它们是相同的......请停在那里并找到更好的文本。他们不是。
我将在此简要解释一下,因此它适用于 Q& A 风格。
C中的数组确实是几个值的连续空间。 char arr[3]
表示包含3 char
s。
另一方面,char *
只是一个指向char
的指针 - 这个可能是数组的第一个元素。
在C中,您不能将数组作为函数参数传递,并且您无法从函数返回数组。尝试这样做会导致隐式转换:实际传递的 是指向该数组的第一个元素的指针。
我认为缺少的最后一点信息是C中的字符串文字:它是一个数组(匿名,例如,它没有名字)包含双引号中的所有字符加上附加0
。 0
标志着"字符串"的结束。在C.
在表达式中,字符串文字计算为指向第一个元素的指针。
所以,像这样:
char *foo = "bar";
将导致foo
指向数组的b
。这就像写作
static const char no_name_0[] = { 'b', 'a', 'r', 0 };
char *foo = &(no_name_0[0]);
答案 2 :(得分:1)
首先,char arr[3];
太过于无法存储"abc\n"
。它必须至少包含5个元素,包括终止空字符。
然后,char *arr[3];
是char*
的3元素数组
您应该将makeArr()
的返回值(具有char*
类型)分配给arr[0]
或其他元素,或者您应该更改arr
中main
的类型函数为char*
,与makeArr()
的返回值类型相同。
此外,此makeArr()
不会生成任何数组并返回(指向)现有数组。 Yoy应该使用malloc()
来“制作数组”。
<强>更新强>
将值char*
赋值给数组char arr[10];
在C中似乎无效。
您应该使用strcpy()
或strncpy()
(比strcpy()
更安全)来复制数组中存储在数组中的字符串。
答案 3 :(得分:0)
将数组作为参数传递并在被调用函数中修改它会更容易。如果您正在静态创建数组并且不需要分配内存,请不要只是通过引用传递指向要修改的函数的指针
void makeArr(char arr[]){
sprintf(arr, "%s\n", "abc");
}
只需将现有的声明数组传递给makeArr函数...
int main(int argc, char *argv[]) {
char arr[10];
makeArr(arr);
return 0;
}
答案 4 :(得分:0)
您无法将makeArr的结果分配给arr。我想这是你的投射错误。过度简化,arr指向堆栈上分配10个字符数组的位置。所以,我会传递arr将makeArr作为char *。所以,你最终会得到这样的东西:
#include <stdio.h>
char * makeArr(char *arr)
{
sprintf(arr, "%s\n", "abc");
return arr;
}
int main(int argc, char *argv[])
{
char arr[10];
makeArr(arr);
printf("%s\n", arr);
return 0;
}