【问题标题】:Return makes integer from pointer without a cast (simple for loop) [duplicate]Return 从没有强制转换的指针生成整数(简单的 for 循环)[重复]
【发布时间】: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 pointers for-loop char


【解决方案1】:

您的函数被声明为返回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

正如您从错误中可以理解的那样,您的代码正在从一个没有显式转换的整数创建一个指针。这是因为您可以这样做,即将整数转换为指针。这是否是正确的做法完全是另一回事,但该标准也允许许多可能被滥用的东西。这就是 的伟大之处,能力越大责任越大。

【讨论】:

  • 如何声明函数返回数组?
  • 你不能返回一个数组,你可以返回一个指向它的指针,在这种情况下这是错误的。
  • 您可以返回一个指向数组的指针,但您必须稍后使用 malloc 和 free 动态分配和释放它。
  • 如果打算返回本地变量 str 的内容,最好不要。请在继续之前阅读有关在 C 中使用数组和指针的信息,否则您的项目可能会成为一场灾难......
  • @iharob 如果您不喜欢我的拼写错误,请随时标记我的评论以删除:-\
【解决方案2】:

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

您的问题的答案是,您无法在 C 中以这种方式执行您想要的操作。用零填充 char 数组(最好留给memset(),而不是使用for 循环) 在函数中并在调用代码中使用它,您需要将指向保留数组的指针传递给函数。

【讨论】:

  • 不一定是8 bits,CHAR_BIT bits。
  • 好吧,因为这在技术上是正确的,所以我打算将 OP 与细节的混淆推迟到以后。对于大多数平台来说,这个近似值应该可以做到,但在这里代码正确无济于事。
猜你喜欢
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多