【发布时间】:2015-04-21 01:04:24
【问题描述】:
我正在学习 C 编程并使用 Geany 在 Ubuntu 中进行一些测试。我有一个关于指针的问题。当一个数组在函数中声明然后作为指针返回时,数组值会在 main 方法中丢失。我可以用一个简单的例子来检查:
#include <stdio.h>
char* msg ();
int main(int argc, char **argv)
{
char* p = msg();
int i;
for(i=0;i<=10;i++)
printf("i: %d, value: %c \n", i, p[i]);
return 0;
}
char* msg (){
char msg [] = "hello";
return msg;
}
输出是随机值(第一个总是'h'的除外)。我想这是因为指针超出了作用域,内存可以被其他函数写入。
但如果 message 的值足够大(例如数千个字符或更少),则值位于相同的内存位置,尽管数组是在其他函数中创建的,但我可以读取它们。
这个结果的原因是什么?
非常感谢。
【问题讨论】:
-
你怎么知道
'h'不是随机的? -
请给我一个很好的理由,你为什么要尝试这个?同一程序中的许多错误。即使您执行
printf("%c\n", p[0]);,您也会调用未定义的行为。 -
我认为'h'不是随机的,因为在执行程序十次之后......
-
我正在做这种测试,以了解堆栈是如何处理的以及内存中保存了哪些值。我知道这是一个错误的实现,但我正在寻找合乎逻辑的答案。
标签: c arrays pointers memory stack