我刚开始学习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);
在这一点之后,发生三件事之一:
- 已进行了就地调整。CCD_ 1
- 没有就地调整大小,而是复制到新的缓冲区。
origdest
现在指向一个大小合适的内存块,该内存块包含dest
过去指向的内容的副本,而dest
是一个无效指针。对dest
的任何操作都是未定义的行为 - 调整大小失败。
origdest == NULL
只有在发生情况1时,您的程序才能工作。
如果发生情况3,则应指示错误并退出或恢复。后者几乎不是一个简单练习的选项,所以插入
assert (origdest != NULL);
在对realloc的调用下方。
现在,如果发生了情况2,您需要恢复由情况1保证的不变量,并且您的代码依赖于该不变量
dest = origdest;
应该做这项工作。
我建议将origdest
重命名为newdest
,因为这是一个新的目的地,而不是原始的目的地。
最后,sizeof(char)
根据定义是1,只要省略它,或者如果您不想依赖这个事实,至少可以一致地使用它。CCD_ 10能更好地反映意图。
现场演示
有一些错误/错误,我建议您如下:
- 使用特定指针对malloc调用进行类型转换(malloc返回void*,这是一种泛型指针,因此在这种情况下必须将其类型转换为char*(
- realloc也是如此
- 最好使用malloc为新指针分配内存
- 在alloc调用之后放入一个NULL检查筛选器,以检查内存是否分配给指针