【发布时间】:2019-10-23 00:59:36
【问题描述】:
我一直在为学校做一些练习题,其中一个问题是,必须将输入的整数写入动态分配的字符串。代码在释放分配的内存(堆损坏发生)之前运行良好。
有人可以解释为什么会发生这种情况以及我做错了什么吗?
int main() {
char *string = NULL;
char **string2 = &string;
Conversion(string2);
printf("Entered number converted to string: %s", string);
free(string);
return 0;
}
int Conversion(char **string) {
int num = 0, temp = 0, dcount = 0;
printf("Enter number: ");
scanf(" %d", &num);
temp = num;
while (temp != 0) {
temp /= 10;
dcount++;
}
*string = (char*)malloc(dcount*sizeof(char));
if (*string == NULL) {
printf("Error during memory allocation!");
return -1;
}
sprintf(*string, "%d", num);
return 0;
}
【问题讨论】:
-
错误:1) 子函数:
Conversion()缺少原型,因此编译器将假定参数的类型和返回的类型,这可能(或可能不)正确。 2) 实际的子函数返回一个'int',表示调用malloc()的失败/成功,但main()中的调用未能检查返回值,3) 当malloc()失败时,main()函数仍然尝试将该 NULL 指针传递给printf()
标签: c string pointers segmentation-fault dynamic-memory-allocation