Arc*_*rus 1 c string pointers segmentation-fault dynamic-memory-allocation
我一直在研究学校的一些练习题,其中之一是必须将输入的整数写到动态分配的字符串中。该代码可以很好地完成工作,直到释放分配的内存(发生堆损坏)为止。
有人可以解释为什么会发生这种情况以及我在做什么错吗?
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;
}
Run Code Online (Sandbox Code Playgroud)
您需要分配一个额外的字符来说明\0终止符。
*string = (char*)malloc((dcount + 1) * sizeof(char));
Run Code Online (Sandbox Code Playgroud)
另外dcount,如果是不正确num为0或负。
其他的建议:
您可以使用snprintf()来计算所需的缓冲区大小。它将节省您所有繁琐的数字工作num,而且可以正确处理所有边缘情况。
int dcount = snprintf(NULL, 0, "%d", num);
Run Code Online (Sandbox Code Playgroud)您应该避免强制转换malloc的返回值。
*string = malloc((dcount + 1) * sizeof(char));
Run Code Online (Sandbox Code Playgroud)sizeof(char) 定义为1。我将省略乘法
*string = malloc(dcount + 1);
Run Code Online (Sandbox Code Playgroud)
但是,如果要保留它,请避免对项目类型进行硬编码。
*string = malloc((dcount + 1) * sizeof(**string));
Run Code Online (Sandbox Code Playgroud)
如果将字符串从更改char*为char16_t*/ char32_t*/,wchar_t*这将自动进行调整,sizeof(char)尽管类型不匹配,该编译也不会出错。
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |