c - 为什么我存在未声明的变量?

标签 c pointers memory-management malloc declaration

我正在用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 文件并只有这个函数和主函数,即使值很大,我也不会再遇到这个问题。)

我的第二个问题是我打印了两次 s ,我发现第二次打印(声明指针结果后) s 被改变了! (与第一个问题类似,如果我为x和y选择较小的值或创建一个新的.c文件,我不会遇到同样的问题。)

我想我对malloc有一些问题但在网上搜索后,我没有找到任何有用的资源可以帮助我解决问题。我有内存管理方面的问题吗?

最佳答案

您的代码至少存在两个严重问题。

第一个问题是您永远不会释放malloc的内容,从而在每次递归调用时产生大量内存泄漏。

第二个问题是您尝试分配字符串,但这没有达到您希望的效果。

这是您所做的示例(我的评论):

 // allocate some memory and assign its address to abcd
 char* abcd=malloc(sizeof(char)*returnSize);

 // throw it away by assigning a different value to abcd
 abcd=karatsuba(stringSum(a,b),stringSum(c,d));
 // then assign yet another different value to abcd
 abcd=stringSubstract(abcd,ac);
 // and another one
 abcd=stringSubstract(abcd,bd);//ab+cd   

 // Code below overflows, because memory abcd is pointing to is 
 // not the original block allocated for it (you threw it away).
 // It is a block allocated and returned by stringSubstract.
 // Its length is not necessarily sufficient to accommodate all
 // the data you are trying to stuff in it.
 int labcd=strlen(abcd);     
 for(i=0;i<=(ns/2-1);i++){
     abcd[labcd+i]='0';
 }
 abcd[lac+i]='\0';

您可以通过在 valgrind 下运行您的程序来验证情况是否如此。在 s 神秘缩短之前,您将收到指示缓冲区溢出的错误消息。从那里开始一切都走下坡路。

为了解决该问题,您可能需要使用 strcpy 而不是指针赋值。解决此问题的另一种方法是放弃函数开头的 abcd = malloc(...) 行,并使用 realloc 确保它们具有分配足够的尺寸。

此外,您肯定想修复内存泄漏。在使用完 malloc 后,您需要为每个变量调用 free。如果您返回一个 malloc 变量,调用者需要在使用它后释放它。

关于c - 为什么我存在未声明的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42879908/

相关文章:

字符串和数字的组合在c中无法正确比较

c - 递增指针时的不明确行为

c++ - 分配字符串指针字符串值时出现问题

c - 共享库重定位 R_X86_64_PC32 错误

arrays - 将 swift 数组的元素分配给 userdata 参数会触发 didSet

c++ - 如何释放 C++ 内存 vector<int> * arr?

iphone - 使用 TBXML textFromElement 时发生内存泄漏

c - 内存分配

java - 包名称破坏了 JNI 类路径?

c - 标准数字输入与 c 中的 if else 命令