gpt4 book ai didi

c - C 中 strlen 的未处理异常

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

我已经在这个问题上停留了一段时间,我不是 C 方面的专家。基本上,我正在尝试制作一个函数来“安全地”将一个字符转换为现有的 char *。

我正在尝试从这个示例中获取“动态分配”方法:

Using strcat in C

我做了一些修改,删除了由 realloc 函数设置的 var(编译器说它返回了 void)。我还修改了它只附加一个字符而不是一组字符。我想这会改变“realloc”参数,所以我没有传递附加字符串的长度,而是传递了“sizeof(char)”(x2 因为原来有一个额外的 sizeof char,我认为是因为空终止符?)

char *buffer = NULL;

int mystrcat(char addition)
{
realloc(buffer, strlen(buffer) + sizeof(char)*2);
if (!buffer)
return 0;
strcat(buffer, addition);
return 1;
}

我这样调用它:

if(!safestrcat(str[i+j]))
printf("Out of Memory");

出于某种原因,我看到了这个:

Unhandled exception at 0x60f0d540 (msvcr100d.dll) in myProg.exe: 0xC0000005: Access violation reading location 0x00000000.

调试器在第 81 行向我展示了 strlen.asm:

main_loop:
mov eax,dword ptr [ecx] ; read 4 bytes

如果这是一个新问题,我很抱歉,但是发生了什么事?为什么加法字符没有追加到缓冲区?

抱歉,我应该补充一点,它编译成功。

最佳答案

  • 你忘记了一个参数
  • sizeof(char) 根据定义为 1
  • 您的realloc 代码已损坏
  • strcat 没有将 char 作为它的第二个参数
  • 我会像 strcat 那样返回新创建的字符串
char* mystrcat(char* buffer, char addition) {
unsigned oldlen = strlen(buffer);
buffer = realloc(buffer, oldlen + 2);
if (buffer == NULL)
return NULL;

buffer[oldlen + 0] = addition;
buffer[oldlen + 1] = '\0';
return buffer;
}

但是,要注意两点:

  1. 必须使用有效的初始化指针调用mystrcat——与strcat相同!
  2. 在失败的情况下,函数返回 NULL – 在这种情况下,调用者有责任确保释放原始缓冲区的内存。这意味着您不能将函数调用为

    buffer = mystrcat(buffer, 'x');

    – 这可能会导致内存泄漏。

所以正确的用法是:

char* something = "hello";
char* buffer = malloc(sizeof(something) + 1);
strcpy(buffer, something);

char* new_buffer = mystrcat(buffer, 'x');
if (new_buffer == NULL) {
free(buffer);
exit(1);
}

buffer = new_buffer;

是的,令人费解。这是安全内存操作的代价。

关于c - C 中 strlen 的未处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10520347/

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