C 程序中的 strcat 不起作用


#include<string.h>
#include<stdio.h>
void main()
{
    char *str1="hello";
    char *str2="world";
    strcat(str2,str1);
    printf("%s",str2);
}

如果我运行此程序,我将获得运行时程序终止。

请帮助我。

如果我使用这个:

char str1[]="hello";
char str2[]="world";

然后它正在工作!

但是为什么

char *str1="hello";
char *str2="world";

此代码不起作用????

你正在从一本糟糕的书中学习。主函数应声明为

int main (void);
将其

声明为 void 会在应用程序完成时调用未定义的行为。好吧,它还没有完成,但最终它会完成。

获取有关 C 语言的书籍。你会发现

char *srt1="hello";

像你写的那样编译

static const char secret_array [6] = { 'h', 'e', 'l', 'l', 'o', 0 };
char* srt1 = (char*) &secret_array [0];

char srt1[]="hello";

像你写的那样编译

char srt1 [6] = { 'h', 'e', 'l', 'l', 'o', 0 };
这两个 strcat 调用

都是严重的错误,因为 strcat 调用的目标没有足够的内存来包含结果。第一次调用也是一个错误,因为您尝试修改常量内存。在第一种情况下,该错误会导致崩溃,这对您来说是一件好事,也很幸运。在第二种情况下,不会立即检测到错误。这是倒霉。你可以打赌,如果你在交付给客户的程序中使用这样的代码,如果你幸运的话,它会崩溃,并导致不正确的结果,这将使你的客户花费很多钱,否则你会被起诉。

在你的代码中。

char *srt1="hello";

您创建了一个指针并将其指向一个常量字符串。编译器将其放在标记为只读的内存部分中。

因此,strcat将尝试修改导致未定义行为的内容。

没有名称,具有静态存储持续时间(意味着它在程序的整个生命周期中存在(;以及一个类型为指针到字符的变量,称为 p,它使用该未命名的只读数组中第一个字符的位置进行初始化。

请参阅我的答案以正确理解为什么它适用于第一种情况而不是第二种情况。

字符串文本是只读的,不能更改它们。

这:

char *srt2="world";

表示srt2(坏名,BTW(是一个指针变量,指向包含常量数据"world"(和终止''字符(的内存。六个字符后没有额外的空间,您甚至无法更改字母。

你需要:

char str2[32] = "world";

另一方面,这使str2成为一个由 32 个字符组成的数组,其中前 6 个字符初始化为 "world" 和终止'' .附加到这个是可以的,因为新字符可以适合现有的数组,只要你不越界并尝试存储超过 32 个字符(包括终止符(。

char *srt1="hello";
char *srt2="world";

当你像这样声明字符串时,它存储在只读内存中!

您无法更改存储在只读内存中的变量!

当您执行strcat时,它会尝试修改字符串,该字符串存在于只读内存中。所以这里不允许!它是"未定义的"。

在你的程序中,str1 和 str2 不应该被写入,因为它们被声明为指向只读内存的指针。要看到这一点,请执行"objdump -s a.out",您将看到以下内容:

Contents of section .rodata:
400640 01000200 68656c6c 6f00776f 726c6400  ....hello.world.
400650 257300                               %s.    

strcat 尝试写入该部分内存,从而导致分段错误。

您也可以使用数组。这是我的一个简单的程序,我遇到了这样的问题,但是在这个问题上,您必须声明数组的大小。喜欢 mahe = [10] .

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char cname[10] = "mahe";
    strcat(cname, "Karim");
    printf("%sn", cname);
    return 0;
}

最新更新