python manage.py makemigration
python manage.py migrate
我的输出:
void resolve_paths(char* inputdir)
{
char** tokens = malloc(64*sizeof(char*));
char* ptr;
char* slash = "/";
int i = 0;
ptr = strtok(inputdir,slash);
while(ptr != NULL){
if(strcmp(ptr,"~") == 0){
ptr = getenv("HOME");
}
tokens[i] = (char*)calloc(64,sizeof(char));
tokens[i] = ptr;
printf("token[%i] = %s\n",i,tokens[i]);
i++;
ptr = strtok(NULL,slash);
}
int j;
printf("freeing each element of tokens\n");
for(j = 0; j < i; j++){
printf("freeing token[%i]\n",j);
free(tokens[j]);
}
free(tokens);
puts("leaving resolve_paths\n");
return;
}
我想我根本不明白malloc / calloc和free的工作方式。为什么这段代码会遇到段错误?
答案 0 :(得分:2)
tokens[i] = ptr;
你的错误。您正在分配一个指针,而不是(正如您所料)将字符串复制到已分配的内存中,因此您可以释放以后未实际分配的内容。
你必须使用strcpy / strncpy将ptr复制到标记[i]。使用类似strncpy(tokens[i],ptr,63)
而不是tokens[i] = ptr;
的内容。
答案 1 :(得分:0)
至于回答malloc()
,calloc()
的工作方式,请转到此处:How do malloc() and free() work?,
你问题的优秀答案。
答案 2 :(得分:0)
tokens[i] = (char*)calloc(64,sizeof(char));
tokens[i] = ptr;
此代码不符合您的想法。首先分配64个字节并将地址存储在tokens[i]
中,然后用ptr
替换该地址(从而丢失刚刚分配的泄漏的地址)。
可能你的意思是
tokens[i] = calloc(64,sizeof(char));
strncpy(tokens[i], ptr, 64);
分配内存,然后将ptr
指向的字符串复制到其中。请注意,您不需要在C中强制转换calloc或malloc的结果,因为void*
可以隐式转换为任何其他指针。
最后,您尝试free(tokens[i])
,但所包含的地址只是由inputdir
调整的strtok
的本地地址,因此它不是您可以正确释放的动态分配地址,这就是你得到错误的原因。