C char 指针 strcpy 内存错误

标签 c memory-management

在 C 语言中,为什么这不起作用:

#include <stdio.h>
int main(void)
{
    char * strA = "Hello ";
    strcat(strA, "World!");
    printf("%s", strA);
    return 0;
}

但这确实:

#include <stdio.h>
int main(void)
{
    char strA[6] = "Hello ";
    strcat(strA, "World!");
    printf("%s", strA);
    return 0;
}

我本来会提出错误,但可惜我使用的是 Xcode,它不喜欢在失败时给我任何可用的东西,只是给我 BAD_ACCESS_EXC(code =2...) 根据快速的 Google 搜索,只是与内存分配错误有关。

我认为您在这两种情况下为 strA 分配了相同数量的内存。有人可以启发我吗?

最佳答案

在第一种情况下,您将 strA 声明为 char *,指向包含字符串 "Hello " 的静态内存。

在第二种情况下,您将创建一个 6 个字符的数组,并使用字符串 "Hello " 进行初始化。

因此,在第一种情况下,

strcat 会尝试写入此静态内存段,从而立即导致错误。

第二个代码仍然无效(因为 strA 不是一个足够大的数组来存储 "Hello World"),可能会或可能不会像您一样出现段错误不尝试附加到字符串文字。

关于C char 指针 strcpy 内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18137898/

相关文章:

c - 退出函数 C 时全局变量更改值

c++ - GHashTable 的大小/调整大小

收银机程序 - C

.net - 销毁所有对象还是让垃圾收集器完成工作更好?

c - 在 C 中搜索递归数据结构

android - 如何清理位图资源

c - 在 64 位二进制文​​件上分配超过 2gb 失败

objective-c - 初始化一个对象,然后将其存储到 NSArray 中。这会泄漏吗?

iphone - 为什么我看到一些代码是在 viewDidUnload 中发布的,而不是在 dealloc 中?

c++ - C : Warning about visibility of a struct