gpt4 book ai didi

c - 为什么释放复制的内存会影响复制?

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

我有这段代码可以重现我在其他地方遇到的问题。问题是我认为我正在创建一组字符的独立副本并为它们提供一个独立的指针,但出于某种原因我不明白编译器是否确定指针指向副本的源。

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>

typedef struct Str{
size_t len;
char* ptr;
}Str;

Str* newStr(char* str);
Str* cpyStr(Str* str);

int main(int argc, char *argv[]){
Str* a = newStr("This is a string");
printf("Returned string a is %s\n", a->ptr);

Str* b = cpyStr(a);
//free(a->ptr);
//free(a);

if(b == NULL) puts("Error getting b");
else printf("Returned string b is %s\n", a->ptr);

return 0;
}

Str* newStr(char* str){
size_t len = strlen(str) + 1;
if(len == 0) return NULL;

Str* toret = malloc(sizeof(Str));
if(toret == NULL) return NULL;

toret->len = len;
toret->ptr = malloc(len * sizeof(char));
if(toret->ptr == NULL) return NULL;

strncpy(toret->ptr, str, len);

return toret;
}

Str* cpyStr(Str* str){
Str* toret = malloc(sizeof(Str));
if(toret == NULL) return NULL;

toret->len = str->len;
printf("Len is %d\n", toret->len);

toret->ptr = malloc(toret->len * sizeof(char));
if(toret->ptr == NULL) return NULL;
strncpy(toret->ptr, str->ptr, toret->len);

return toret;
}

如果我不注释掉 free(a->ptr),我会得到一个由方框和一些随机字符组成的字符串,而不是“这是一个字符串”。

这是在 mingw64 上进行的 C 编译。

最佳答案

else printf("Returned string b is %s\n", a->ptr);

应该是b->ptr吗?

关于c - 为什么释放复制的内存会影响复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21248458/

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