【发布时间】:2016-05-19 11:40:09
【问题描述】:
为什么这段 C 代码会返回标题中的警告?
char n_zeroes(int n) {
char str[n];
int i;
for (i = 0; i < n; i++) {
str[i] = '0';
}
return str;
}
【问题讨论】:
为什么这段 C 代码会返回标题中的警告?
char n_zeroes(int n) {
char str[n];
int i;
for (i = 0; i < n; i++) {
str[i] = '0';
}
return str;
}
【问题讨论】:
您的函数被声明为返回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* 函数一起使用或使用"%s" 说明符传递给*printf() 函数的有效字符串最后需要一个额外的元素,具体值为'\0'或0。
正如您从错误中可以理解的那样,您的代码正在从一个没有显式转换的整数创建一个指针。这是因为您可以这样做,即将整数转换为指针。这是否是正确的做法完全是另一回事,但该标准也允许许多可能被滥用的东西。这就是c 的伟大之处,能力越大责任越大。
【讨论】:
您的问题的答案是,因为str 是一个指向数组的指针,编译器将它转换为预期的返回值(char,它转换为有符号整数8 位通常是 1 字节宽)并感觉到您的代码和您的意图之间有问题...
您的问题的答案是,您无法在 C 中以这种方式执行您想要的操作。用零填充 char 数组(最好留给memset(),而不是使用for 循环) 在函数中并在调用代码中使用它,您需要将指向保留数组的指针传递给函数。
【讨论】:
8 bits,CHAR_BIT bits。