为什么这个C代码会在标题中返回警告?
char n_zeroes(int n) {
char str[n];
int i;
for (i = 0; i < n; i++) {
str[i] = '0';
}
return str;
}
答案 0 :(得分:4)
您的函数被声明为返回char
,并且您返回的数组为char
。但即使你修复了应该是char *
的返回值,它仍然是错误的,因为你不应该返回一个局部变量,而是将数组作为参数传递给函数,就像这样
void
n_zeroes(int n, char *str)
{
for (int i = 0 ; i < n ; ++i)
str[i] = '0';
}
但这与
基本相同memset(str, '0', n);
另外,请注意,仅使用零填充的此数组不表示字符串,以使其成为可用于str
*函数的有效字符串,或者使用{传递给* printf()
函数{1}}说明符最后需要一个额外的元素,其特定值为"%s"
或'\0'
。
正如你可以从错误中理解你的代码正在制作指针,来自没有显式强制转换的整数。这是因为您可以这样做,即将整数转换为指针。这是否是正确的事情是完全不同的事情,但标准允许许多可能被误用的事情。这是c的伟大之处,强大的力量带来了巨大的责任。
答案 1 :(得分:0)
您的问题的答案是,因为str
是指向数组的指针,编译器会将其转换为预期的返回值(char
,转换为有符号整数 8位通常是1个字节宽)并且感觉到你的代码和你的意图之间有什么问题......
你的问题的答案是,你不能用这种方式在C中做你想做的事。用零填充一个char数组(一个更好的任务留给memset()
而不是for
1}} loop)在一个函数中并在调用代码中使用它,你需要将指向保留数组的指针传递给函数。