我有下面的代码,当我得到分段错误时,我已经注释了,而当没有时,我已经注释了它。尝试释放内存时出现分段错误
本来我得到了分段错误,然后我可以找出可能我无法初始化我的字符指针位置,如"abcd"
。但我无法理解 - 为什么?
我想testString = "abcd";
会把a
在第一存储器地址,b
在第二等等...试图释放内存的时候,基于我如何初始化的内存位置发生
分段故障。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char* testString = malloc(sizeof(char) * 5);
printf("Size of char is: %d\n", sizeof(char));
printf("Size of int is: %d\n", sizeof(int));
for(int i = 0; i < 5; i++)
{
printf("Pointer addresses are: %p\n", testString + i);
}
char* tempPtr = testString + 2;
printf("My temp pointer address = %p\n", tempPtr);
// This gives me segmentation fault ....
testString = "abcd";
// This will not give me segmentation fault ....
//int count = 65;
//for(int i = 0; i < 5; i++)
//{
// testString[i] = count + i;
//}
printf("Printing character...\n");
for(int i = 0; i < 5; i++)
{
printf("Characters are: %c\n", testString[i]);
}
printf("Freeing memory...\n");
free(testString);
//printf("Access after freeing >>%c<<\n", tempPtr[0]);
//free(testString);
}
基于@ M.M。和@乔纳森的评论我明白,与testString = "abcd";
我testString
将指向一个内存位置字符串“abcd”被创建,因为我没有malloc'ed它,我不能释放它。另外,因为我原来的堆内存指针(我使用malloc)已经不存在了,所以它浪费了内存或内存。
那么,这是否意味着当我使用像printf("Printing character...\n");
这样的printf语句时,这也是内存泄漏?那我该如何避免呢?循环并插入char *当然是一个坏主意。
'testString =“abcd”'表示指针'testString'现在将指向包含'“abcd”'的内存位置。然后,您尝试“释放”该位置,导致分段错误。 –
请注意'testString =“abcd”;'抛弃指向已分配内存的指针(内存泄漏)。或许你需要'strcpy()'。由于'malloc()'(或'calloc()'或'realloc()')没有返回字符串字面值(指针值),所以不能释放它。 –
@ l3x我不想使用某些内置函数,并希望实现最基本的方法。感谢评论。 – hagrawal