运行简单的字符串C程序时出现总线错误[重复]
|
这个问题已经在这里有了答案:
没有找到相关结果
已邀请:
3 个回复
疏腔傻小雹
数组(在C ++中为
),具有静态范围(这意味着它们的内存在程序启动时分配,并保留到程序退出为止)。该内存可能是可写的,也可能是不可写的,具体取决于平台,因此尝试修改字符串文字会导致未定义的行为(这意味着编译器实际上可以执行其想要执行的任何操作)。简而言之,您无法写入字符串文字。 当您写
时,您会遇到两个问题:首先,目标数组是字符串文字,如上所述,它是不可写的。其次,它的大小不足以容纳其他字符。它的大小可以容纳9个字符(包括0终止符),但是您正尝试在其中存储11个字符。这是缓冲区溢出,如果您破坏了一些重要内容,则可能导致不良后果。 您必须分配一个可写的目标缓冲区。您有几种选择: 您可以声明一个足以容纳结果字符串的数组,尽管通常您不会在编译时知道“足够大”的大小:
在C99中,可以声明一个可变长度数组(VLA),其大小在运行时才知道:known6ѭ 您可以使用
或
动态分配目标缓冲区(这实际上是首选方法,因为可以根据需要调整缓冲区的大小,这与VLA不同):
田损比报
和
是字符串文字,它们可能位于地址空间的只读部分。您不应尝试修改它们。
这将确保将文字复制到堆栈中-这是可写的。然后,您后面的strcat将溢出堆栈缓冲区,这同样很糟糕。 以下方法将起作用-即使通常不使用
而不是
。
殿虫
还有几点:
返回
。 符号
(从
起比0更清晰)。 在C语言中,不带参数的函数应声明为ѭ21For。对于
,空括号无效。