如何修复C中的此错误(大小为1的无效写入错误)



我刚开始学习C。我完全不知道我错过了什么。它一直在说大小为1的无效写入错误。我该如何解决这个问题?非常感谢。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *mystrcat(char *dest, const char *src)
{
char *origdest = realloc(dest,(strlen(dest) + strlen(src))*sizeof(char) + 1);
while (*dest)
{
dest++;
}
while (*src)
{
*dest++ = *src++; // Copy the source
}
*dest = 0;
return origdest;
}

int main(void)
{
char *str = malloc(7);
strcpy(str, "Aatami");
str = mystrcat(str, "Beetami");
printf("%sn", str);
free(str);
return 0;
}
char *origdest = realloc(dest,(strlen(dest) + strlen(src))*sizeof(char) + 1);

在这一点之后,发生三件事之一:

  1. 已进行了就地调整。CCD_ 1
  2. 没有就地调整大小,而是复制到新的缓冲区。origdest现在指向一个大小合适的内存块,该内存块包含dest过去指向的内容的副本,而dest是一个无效指针。对dest的任何操作都是未定义的行为
  3. 调整大小失败。origdest == NULL

只有在发生情况1时,您的程序才能工作。

如果发生情况3,则应指示错误并退出或恢复。后者几乎不是一个简单练习的选项,所以插入

assert (origdest != NULL);

在对realloc的调用下方。

现在,如果发生了情况2,您需要恢复由情况1保证的不变量,并且您的代码依赖于该不变量

dest = origdest;

应该做这项工作。

我建议将origdest重命名为newdest,因为这是一个新的目的地,而不是原始的目的地。

最后,sizeof(char)根据定义是1,只要省略它,或者如果您不想依赖这个事实,至少可以一致地使用它。CCD_ 10能更好地反映意图。

现场演示

有一些错误/错误,我建议您如下:

  1. 使用特定指针对malloc调用进行类型转换(malloc返回void*,这是一种泛型指针,因此在这种情况下必须将其类型转换为char*(
  2. realloc也是如此
  3. 最好使用malloc为新指针分配内存
  4. 在alloc调用之后放入一个NULL检查筛选器,以检查内存是否分配给指针

最新更新