返回从指针生成整数而没有强制转换(简单的for循环)

时间:2016-02-09 13:05:57

标签: c pointers for-loop char

为什么这个C代码会在标题中返回警告?

char n_zeroes(int n) {
  char str[n];

  int i;
  for (i = 0; i < n; i++) {
    str[i] = '0';
  }

  return str;
}

2 个答案:

答案 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'

正如你可以从错误中理解你的代码正在制作指针,来自没有显式强制转换的整数。这是因为您可以这样做,即将整数转换为指针。这是否是正确的事情是完全不同的事情,但标准允许许多可能被误用的事情。这是的伟大之处,强大的力量带来了巨大的责任。

答案 1 :(得分:0)

您的问题的答案是,因为str是指向数组的指针,编译器会将其转换为预期的返回值(char,转换为有符号整数 8位通常是1个字节宽)并且感觉到你的代码和你的意图之间有什么问题......

你的问题的答案是,你不能用这种方式在C中做你想做的事。用零填充一个char数组(一个更好的任务留给memset()而不是for 1}} loop)在一个函数中并在调用代码中使用它,你需要将指向保留数组的指针传递给函数。