Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用free()释放内存时出现问题_C_Malloc_Free_Memory Management - Fatal编程技术网

C 使用free()释放内存时出现问题

C 使用free()释放内存时出现问题,c,malloc,free,memory-management,C,Malloc,Free,Memory Management,我无法释放使用malloc分配的内存。该程序运行良好,直到它找到了应该使用空闲内存释放内存的部分。在这里,程序冻结。所以我想知道这个问题可能是什么,因为我刚刚学习C。从语法上看,代码似乎是正确的,那么可能是我需要删除该位置中的所有内容,然后再从该位置或其他位置释放内存 这是密码 // Program to accept and print out five strings #include <stdio.h> #include <stdlib.h> #include &l

我无法释放使用malloc分配的内存。该程序运行良好,直到它找到了应该使用空闲内存释放内存的部分。在这里,程序冻结。所以我想知道这个问题可能是什么,因为我刚刚学习C。从语法上看,代码似乎是正确的,那么可能是我需要删除该位置中的所有内容,然后再从该位置或其他位置释放内存

这是密码

// Program to accept and print out five strings
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NOOFSTRINGS 5
#define BUFFSIZE 255

int main()
{
    char buffer[BUFFSIZE];//buffer to temporarily store strings input by user
    char *arrayOfStrngs[NOOFSTRINGS];
    int i;

    for(i=0; i<NOOFSTRINGS; i++)
    {
        printf("Enter string %d:\n",(i+1));
        arrayOfStrngs[i]=(char*)malloc(strlen(gets(buffer)+1));//calculates string length and allocates appropriate memory
        if( arrayOfStrngs[i] != NULL)//checking if memory allocation was successful
        {
            strcpy(arrayOfStrngs[i], buffer);//copies input string srom buffer to a storage loacation
        }
        else//prints error message and exits
        {
            printf("Debug: Dynamic memory allocation failed");
            exit (EXIT_FAILURE);
        }
    }

    printf("\nHere are the strings you typed in:\n");
    //outputting all the strings input by the user
    for(i=0; i<NOOFSTRINGS; i++)
    {
        puts(arrayOfStrngs[i]);
        printf("\n");
    }

    //Freeing up allocated memory
    for(i=0; i<NOOFSTRINGS; i++)
    {
        free(arrayOfStrngs[i]);
        if(arrayOfStrngs[i] != NULL)
        {
            printf("Debug: Memory deallocation failed");
            exit(EXIT_FAILURE);
        }
    }

    return 0;
}
误用strlen会导致缓冲区溢出:

arrayOfStrngs[i]=(char*)malloc(strlen(gets(buffer)+1)); //pointer from gets() is incremented and passed to strlen()  - that's wrong
应该是

arrayOfStrngs[i]=(char*)malloc(strlen(gets(buffer))+1); //pointer from gets() is passed to strlen(), then returned value is incremented - correct
同样,free不会更改传递给它的指针。所以

 char* originalValue = pointerToFree;
 free( pointerToFree ); 
 assert( pointerToFree == originalValue ); //condition will always hold true
因此,在代码中,释放内存应该是

//Freeing up allocated memory
for(i=0; i<NOOFSTRINGS; i++)
{
    free(arrayOfStrngs[i]);
}
误用strlen会导致缓冲区溢出:

arrayOfStrngs[i]=(char*)malloc(strlen(gets(buffer)+1)); //pointer from gets() is incremented and passed to strlen()  - that's wrong
应该是

arrayOfStrngs[i]=(char*)malloc(strlen(gets(buffer))+1); //pointer from gets() is passed to strlen(), then returned value is incremented - correct
同样,free不会更改传递给它的指针。所以

 char* originalValue = pointerToFree;
 free( pointerToFree ); 
 assert( pointerToFree == originalValue ); //condition will always hold true
因此,在代码中,释放内存应该是

//Freeing up allocated memory
for(i=0; i<NOOFSTRINGS; i++)
{
    free(arrayOfStrngs[i]);
}
难道不是吗

arrayOfStrngs[i]=(char*)malloc(strlen(gets(buffer))+1);
难道不是吗

arrayOfStrngs[i]=(char*)malloc(strlen(gets(buffer))+1);

是的,没错。当前实现的特点是缓冲区溢出。是的,没错。当前实现的特点是缓冲区溢出。经典风格的错误。将代码放在多行中不会花费更多。另外,gets可以返回NULL,kaboom。!!!永远不要使用它。曾经顺便说一句,您的错误报告是错误的:调用free不会影响您传入的指针的值-在C中,如果不添加另一层间接寻址,这是不可能的,free不会。即使内存被成功释放,您的程序也会认为它不是。将代码放在多行中不会花费更多。另外,gets可以返回NULL,kaboom。!!!永远不要使用它。曾经顺便说一句,您的错误报告是错误的:调用free不会影响您传入的指针的值-在C中,如果不添加另一层间接寻址,这是不可能的,free不会。即使内存被成功释放,您的程序也会认为它不是。非常感谢。事实上,我对free并不十分熟悉,所以关于free的提示不改变指针的值是很有启发性的。不过你是对的。缓冲区溢出是问题的原因,但我忘了在上面的问题中包含一些内容,如果您也在这方面提供帮助,我将不胜感激。在没有程序员指定的情况下,如何在从用户获取输入数据之前清除数组缓冲区的所有以前的数据?在没有程序员指定的情况下,如何在从用户获取输入数据之前清除数组缓冲区的所有以前的数据?事实并非如此。不需要这样。之前的数据会被覆盖。非常感谢。事实上,我对free并不十分熟悉,所以关于free的提示不改变指针的值是很有启发性的。不过你是对的。缓冲区溢出是问题的原因,但我忘了在上面的问题中包含一些内容,如果您也在这方面提供帮助,我将不胜感激。在没有程序员指定的情况下,如何在从用户获取输入数据之前清除数组缓冲区的所有以前的数据?在没有程序员指定的情况下,如何在从用户获取输入数据之前清除数组缓冲区的所有以前的数据?事实并非如此。不需要这样。以前的数据被覆盖。