【发布时间】:2017-03-18 21:09:08
【问题描述】:
我正在用 C 编写一个函数。我发现当我在 gdb 中调试时,我发现一个指针“result”与声明“result”之前的另一个指针具有相同的地址。我的部分代码:
char* stringSum(char* x, char* y){
puts(x);
puts(y);
printf("\n");
int lengthx=strlen(x);
int lengthy=strlen(y);
int lengths=MIN(lengthx,lengthy);
int lengthl=MAX(lengthx,lengthy);
char* s=((lengthx<=lengthy)?x:y);
char* l=((lengthx>lengthy)?x:y);
int returnSize=MAX(lengthx, lengthy)+2;//-----I could print result now
printf("before, short is : ");puts(s);
char* result=malloc(sizeof(char)*returnSize);//-----but result is allocated now
printf("after allocate memory for result, short is: ");puts(s);//---s is changed!
result[returnSize-1]='\0';
......
}
这个函数得到两个数字的总和(在字符串中),这样我就可以计算两个大数的总和。在 gdb 中:我遇到了这个奇怪的问题:
My problems are in red and yellow rectangles
(在 gdb 中调试时)在 char* result=malloc(sizeof(char)*returnSize); 之前我打印了 s 和结果(所以现在它还没有被声明)并得到了
(gdb) print s
$5 = 0x61f950 "6597242170048699800240000000000"
(gdb) print result
$6 = 0x61f950 "6597242170048699800240000000000"
我无法理解,因为未声明的指针如何指向现有地址? (此函数由另一个具有大量 x 和 y (在字符串中)的函数调用。如果我将它们更改为相对较小的值,我将始终得到正确的答案。此外,如果我创建一个新的 .c 文件并只有这个函数和main函数,再大的值我都不会再有这个问题了。)
我的第二个问题是我打印了两次s,发现第二次打印(声明指针结果后)s变了! (与第一个问题类似,如果我为 x 和 y 选择较小的值或创建一个新的 .c 文件,我不会遇到同样的问题。)
我想我对malloc 有一些问题,但是在网上搜索后我没有找到任何有用的资源可以帮助我解决问题。我有关于内存管理的问题吗?
【问题讨论】:
-
那段代码是如何编译的?你看过机器/汇编代码吗?代码有什么问题?
-
当您尝试在定义之前获取
result的值时,我相信结果令人惊讶的是未定义;)。在这种情况下,结果与s相同 -
但问题似乎是相反的情况也是如此,当分配
result时,s神奇地改变了...... -
您是否在抱怨
gdb能够在执行到达其声明之前打印变量?这是正常的。gdb不知道变量的声明点。在这种情况下gdb打印的值将是不可预测的。 -
@n.m.我从来不知道!然后我想我唯一的问题是第二个。非常感谢!
标签: c pointers memory-management malloc declaration