为什么会发生堆损坏?

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)

Joh*_*ica 5

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

*string = (char*)malloc((dcount + 1) * sizeof(char));
Run Code Online (Sandbox Code Playgroud)

另外dcount,如果是不正确num为0或负。

其他的建议: