我有下面的代碼,當我得到分段錯誤時,我已經註釋了,而當沒有時,我已經註釋了它。嘗試釋放內存時出現分段錯誤
本來我得到了分段錯誤,然後我可以找出可能我無法初始化我的字符指針位置,如"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