5
#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";

此代码不起作用????

4

6 回答 6

7

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

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

于 2014-08-26T09:32:30.660 回答
2

在你的代码中。

char *srt1="hello";

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

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

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

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

于 2014-08-26T09:28:29.820 回答
1

字符串文字是只读的,您无法更改它们。

这个:

char *srt2="world";

mean srt2(bad name, btw) 是一个指针变量,指向包含常量数据"world"(和终止'\0'字符)的内存。六个字符之后没有额外的空间,你甚至不能改变字母。

你需要:

char str2[32] = "world";

另一方面,这str2是一个包含 32 个字符的数组,其中前 6 个字符被初始化为"world"和一个终止的'\0'. 可以附加到此,因为新字符可以放入现有数组中,只要您不越界并尝试存储超过 32 个字符(包括终止符)。

于 2014-08-26T09:29:24.147 回答
1
char *srt1="hello";
char *srt2="world";

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

您不能更改存储在只读存储器中的变量!

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

于 2014-08-26T09:24:27.033 回答
0

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

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

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

于 2014-08-26T09:35:45.373 回答
0

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

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char cname[10] = "mahe";
    strcat(cname, "Karim");
    printf("%s\n", cname);
    return 0;
}
于 2017-03-25T05:51:18.927 回答