我的程序在调用'strcpy()';
您无法覆盖指向a的我的程序在调用'strcpy()';,c,C,您无法覆盖指向a的str1指针,并且您的程序正在尝试将指针指向的内存写入,而指针指向的内存在大多数情况下会导致未定义的行为,从而导致分段错误。甚至最糟糕的是,如果事先没有分配必要的空间,就无法连接 如果你想让你的代码工作,你需要这样的东西 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *str1 = "Bangladesh Bogus Part
str1
指针,并且您的程序正在尝试将指针指向的内存写入,而指针指向的内存在大多数情况下会导致未定义的行为,从而导致分段错误。甚至最糟糕的是,如果事先没有分配必要的空间,就无法连接
如果你想让你的代码工作,你需要这样的东西
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *str1 = "Bangladesh Bogus Party";
char *str2 = "Sad is a beautiful Country";
strcpy(str1 + 11, str2 + 4);
strcat(str1, "! !! !!!");
printf("\n%s", str1);
return 0;
}
#包括
#包括
内部主(空)
{
char str1[42]=“孟加拉国伪党”;
const char*str2=“萨德是一个美丽的国家”;
strcpy(str1+11,str2+4);
strcat(str1,“!!!!”);
printf(“%s\n”,str1);
返回0;
}
请注意,
str1
不再是字符串文字,而str2
则是。这是因为str2
从未被修改过,我添加了const
说明符以防止意外修改。要完全防止这种情况是不可能的,但是const
可以帮助您在无意中注意到。主要问题是str1
指向字符串文字。它们位于内存的只读部分,因此试图更改它们通常会导致程序崩溃。与其将str1定义为指针,不如将其定义为使用所述文字初始化的数组:
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[42] = "Bangladesh Bogus Party";
const char *str2 = "Sad is a beautiful country";
strcpy(str1 + 11, str2 + 4);
strcat(str1, "! !! !!!");
printf("%s\n", str1);
return 0;
}
但是,如果执行此操作,数组将没有足够的空间添加额外的字符。因此,使阵列更大,以便有足够的空间:
char str1[] = "Bangladesh Bogus Party";
strcpy
和strcat
都要求第一个操作数指向既可写又足以容纳结果的内存
在您的情况下,这两个要求都没有得到满足
字符串文本通常由编译器放在写保护内存中gcc
将字符串文本放在写保护内存中。其他编译器可以做不同的事情
通过在可写内存中创建str1
,并增加其大小,使其足以容纳整个字符串,可以解决此问题
对于字符串终止符,结果字符串将为41个字符+1
以下是几种不同的方法:
char str1[50] = "Bangladesh Bogus Party";
或
或
不要试图修改字符串文字。gcc是编译器;它不会运行程序。
char str1[42] = "Bangladesh Bogus Party"; // Declare str1 as an array
char *str1 = malloc(42); // Allocate str1 dynamically
strcpy(str1, "Bangladesh Bogus Party"); // and copy the string to it
char *str1 = strdup("Bangladesh Bogus Party"); // Allocate str1 dynamically and copy the string to it. It will only be just big enough to hold the initial data
str1 = realloc(str1, 42); // Increase the size to 42.