Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的程序在调用'strcpy()';_C - Fatal编程技术网

我的程序在调用'strcpy()';

我的程序在调用'strcpy()';,c,C,您无法覆盖指向a的str1指针,并且您的程序正在尝试将指针指向的内存写入,而指针指向的内存在大多数情况下会导致未定义的行为,从而导致分段错误。甚至最糟糕的是,如果事先没有分配必要的空间,就无法连接 如果你想让你的代码工作,你需要这样的东西 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *str1 = "Bangladesh Bogus Part

您无法覆盖指向a的
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.