【问题标题】:how does returning a char vs int variables works in C?在 C 中返回 char 与 int 变量如何工作?
【发布时间】:2015-09-07 06:23:42
【问题描述】:

如何返回一个 int 的局部变量,但 char 没有? 代码sn-p

int myfn1() {
int i=10;
return i;
}

char myfn2() {
char buf[10]="Hello";
return buf;
}

int main(){
printf("%d\n", myfn1());
printf("%s\n", myfn2());
}

输出:

10
Segmentation fault

我是 C 编程新手,我知道局部变量的范围在该函数内,myfn2 崩溃对我来说是有意义的,但 myfn1 是如何工作的?

【问题讨论】:

  • buf 似乎既不是局部变量也不是char。是否可能缺少一些位?
  • 你没有返回一个字符。 buf 不是 char
  • 我认为你应该停下来研究一下指针及其与字符串/数组的关系(注意我没有说字符)。
  • myFn1 正在返回 i。所以它有效。 (i 正在底层程序集中的返回寄存器中返回。)您的 myfn2 有一个 char [] 代表 buf不是 char!)和return buf返回buf地址,它是临时(在myfn2 的堆栈上)。所以myfn2返回后,buf的地址就不再有效了。即使myfn2 返回值被正确声明也是如此。
  • 注意编译器错误/警告,它应该指出了myfn2的问题。 (如果没有,请调高错误级别)。

标签: c char int return


【解决方案1】:

这段代码

char myfn2() {
buf[10]="Hello";
return buf;
}

是对不应该做的事情的总结!

char myfn2() 承诺返回 char 而你返回的是 char *return buf[0];return *buf; 将消除错误并且是正确的,因为您将返回一个整数值 - 但您显示带有 %c 而不是 %schar,后者用于以空字符结尾的字符数组。

但要小心:

char * myfn2() {
buf[10]="Hello";
return buf;
}

通常不会导致错误,但会是明显的未定义行为,因为函数会返回自动变量的地址,在您使用它之前可能会被销毁。

我觉得你还是要学C...

【讨论】:

    【解决方案2】:

    在 C 中,数组的名称是其第一个元素的 pointer,因此您将 pointer 返回到 char 而不是 char,这就是您声明的 myfn2() 返回的内容。

    【讨论】:

      【解决方案3】:

      问题是返回char *。完全没问题。

      问题是取消引用指向不再有效位置的指针。 printf("%d\n", myfn1()); printf int。打印指针的,同样可以:

      int main(void) {
        printf("%p\n", (void*) myfn2());  // OK - pointer's value is printed
        printf("%s\n", myfn2());          // Bad - code attempts sting access to invalid pointer.
      }
      

      【讨论】:

        【解决方案4】:

        printf("%s\n", myfn2());

        %s ==> 从地址开始读取并在到达“/0”时结束,但是您传递的是一个包含一些 8 位数据的字符,它可以容纳的最大值是 255。

        输入的 char 值将被视为地址,并且地址范围非常小(通常为 32 位/64 位地址),因此它不会为输入找到任何物理内存。所以我们遇到了分段错误。

        【讨论】:

          【解决方案5】:

          myfn1 是如何工作的?

          之所以有效,是因为您返回的是存储在变量“i”中的值,而不是“i”的地址。

          myfn2 返回数组 'buf' 的地址,该地址不再有效。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-24
            • 1970-01-01
            • 2019-11-22
            • 2021-12-11
            • 1970-01-01
            相关资源
            最近更新 更多