【问题标题】:C : Access violation reading location 0x00000044C : 访问冲突读取位置 0x00000044
【发布时间】:2020-03-17 21:40:01
【问题描述】:

我有一个标题为 [what],[where],[who] 的文件,我将它放入一个数组列表中。 我正在尝试将括号和单词数组连接在一起。像 [ what ] 但会弹出错误。

" 在 project.exe 中的 0x0F20EDD0 (ucrtbased.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x00000044"

char intent[255];
char inv[3][10] = { "what","where","who" };

//char stringCat = strncat(intent, inv[0],10);
snprintf(intent, sizeof(intent), "[%s]", inv[0]);

我能知道为什么会这样吗?

【问题讨论】:

  • 检查编译器警告。您至少有 3 种不同的警告类型:混合字符和字符指针,使用字符串文字而不是最突出的字符文字。
  • strcat 需要 指针 而不是字符。 intent[0] 不是指针。
  • intent[0] = "[" => intent[0] = '['
  • 如果你的编译器没有警告你这些不匹配,你需要一个更好的编译器。您将永远无法使用您正在使用的编译器学习 C。
  • 嗨,我已经更改了上面的代码,但它仍然给我错误。

标签: c arrays string concat


【解决方案1】:

intent[0] 是一个字符,而不是一个字符 *。 strcat 将附加到第一个参数中指向的 char * 的末尾,因此您会收到错误消息。更改为 strcat(intent, inv[0]) 将解决这个直接问题,但代码仍然是错误的。

你需要字符串是零终止的,所以你需要在 strcat() 之前的 intent[1] = '\0'。

strcat 也只是简单地写入意图的末尾,因此 stringCat 和 totalCat 是无意义的变量——它们只是指向意图。

你最好使用 strncat() 而不是 strcat() 来防止缓冲区溢出。

【讨论】:

  • 对不起,所以不是意图[0] 和意图[6] 我只是把意图?不会被覆盖吗?
  • 不,strcat() 添加到字符串的末尾。 strcpy() 写入您指向的内存,strcat 找到终止的 '\0' 并开始在那里写入。
  • 另外,如果是我写这篇文章,我会用一个 snprintf() 调用来完成这一切:snprintf(intent, sizeof(intent), "[%s]", inv[0 ])
  • 嗨,我已经更改了上面的代码,但它仍然给我错误。
  • 您已将意向声明更改为字符。它必须是一个字符数组。而且您不需要为它分配 '[' 或 ']' 字符 - snprintf() 会为您完成所有这些工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
相关资源
最近更新 更多