gpt4 book ai didi

c - 尝试释放内存时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:55:22 24 4
gpt4 key购买 nike

我有下面的代码,当我遇到段错误和没有遇到段错误时,我都在其中发表了评论。

最初我遇到了段错误,然后我发现我可能无法像 "abcd" 那样初始化我的 char 指针位置。但我无法理解 - 为什么?

我认为 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.和@Jonathan 的评论,我理解 testString = "abcd"; 我的 testString 将指向创建字符串“abcd”的内存位置,因为我没有 malloc编辑它我无法释放它。另外,由于我原来指向堆内存的指针(我使用 malloc 得到的)不见了,所以这是内存浪费或内存导致。

那么,是否意味着当我使用printf("Printing character...\n");这样的printf语句时,这也是内存泄漏?那我该如何避免呢?循环并插入到 char* 中肯定是个坏主意。

最佳答案

这一行:

testString = "abcd";

正在用字符串文字的地址覆盖对 malloc() 的调用给出的指针:“abcd” 这会导致内存泄漏,因为原始指针分配的内存丢失。

在 C 中,复制字符串时,它“应该”由函数处理:strcpy()strncpy(),它们不会破坏包含在测试字符串

strcpy( testString, "abcd" );
strncpy( testString, "abcd", strlen( "abcd" ) );

自然地,一旦指向分配内存的指针被赋值语句覆盖/销毁:testString = "abcd";,放入testString的新值必须不会传递给 free()

段错误会在调用 free() 时发生,而不是在将新指针错误分配给 testString 时发生。

关于c - 尝试释放内存时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35108205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com