gpt4 book ai didi

c - 为什么会发生堆损坏?

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

我一直在为学校做一些练习题,在其中一个练习题中,输入的整数必须写入动态分配的字符串。代码在释放分配的内存之前一切正常,此时堆损坏发生。

有人可以解释为什么会这样以及我做错了什么吗?

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;
}

最佳答案

您需要分配一个额外的字符来说明 \0 终止符。

*string = (char*)malloc((dcount + 1) * sizeof(char));

如果 num 为 0 或负数,dcount 也是不正确的。

其他评论:

  • 你可以 use snprintf() to calculate the needed buffer size .它会为您省去计算 num 中数字的所有繁重工作,而且它会正确处理所有边缘情况。

    int dcount = snprintf(NULL, 0, "%d", num);
  • 你应该 avoid casting malloc's return value .

    *string = malloc((dcount + 1) * sizeof(char));
  • sizeof(char) 定义为 1。我会省略乘法

    *string = malloc(dcount + 1);

    但是,如果您真的离开它,avoid hard coding the item type .

    *string = malloc((dcount + 1) * sizeof(**string));

    如果您将字符串从 char* 更改为 char16_t*/char32_t*/wchar_t* 这将自动调整,而 sizeof(char) 会在类型不匹配的情况下编译而不会出错。

关于c - 为什么会发生堆损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56495680/

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