将数据复制到C中的空字符串时发生意外截断

将数据复制到C中的空字符串时发生意外截断,c,arrays,gcc,C,Arrays,Gcc,我是C初学者,正在编写一个程序,将字符串从一个字符数组复制到另一个字符数组: #include <stdio.h> void stringCopy(char s[], char t[]); int main(void){ char originalString[] = "pineapple"; // original string first char newVariable[] = ""; // empty string initialised and decl

我是C初学者,正在编写一个程序,将字符串从一个字符数组复制到另一个字符数组:

#include <stdio.h>

void stringCopy(char s[], char t[]);

int main(void){
    char originalString[] = "pineapple"; // original string first
    char newVariable[] = ""; // empty string initialised and declared after
    stringCopy(newVariable,originalString);
    printf("Original string data: %s\n",originalString);
    printf("String in new variable: %s",newVariable);
    return 0;
}

void stringCopy(char s[], char t[]){
    int i=0;
    while((s[i] = t[i]) != '\0')
        i++;
}
#包括
无效字符串副本(字符s[],字符t[]);
内部主(空){
char originalString[]=“菠萝”//首先是原始字符串
char newVariable[]=“”;//在
stringCopy(newVariable,originalString);
printf(“原始字符串数据:%s\n”,原始字符串);
printf(“新变量中的字符串:%s”,newVariable);
返回0;
}
无效字符串副本(字符s[],字符t[]{
int i=0;
而((s[i]=t[i])!='\0')
i++;
}
我想知道的是,上面的代码最终将原始字符串的前面截断了一个字符:

但是下面的代码(按照声明/初始化数组originalString和newVariable的顺序进行交换)工作正常

#include <stdio.h>

void stringCopy(char s[], char t[]);

int main(void){
    char newVariable[] = ""; // empty string initialised and declared first
    char originalString[] = "pineapple"; // original string data after
    stringCopy(newVariable,originalString);
    printf("Original string data: %s\n",originalString);
    printf("String in new variable: %s",newVariable);
    return 0;
}

void stringCopy(char s[], char t[]){
    int i=0;
    while((s[i] = t[i]) != '\0')
        i++;
}
#包括
无效字符串副本(字符s[],字符t[]);
内部主(空){
char newVariable[]=“”;//首先初始化并声明空字符串
char originalString[]=“菠萝”;//后面的原始字符串数据
stringCopy(newVariable,originalString);
printf(“原始字符串数据:%s\n”,原始字符串);
printf(“新变量中的字符串:%s”,newVariable);
返回0;
}
无效字符串副本(字符s[],字符t[]{
int i=0;
而((s[i]=t[i])!='\0')
i++;
}

为什么在首先初始化空字符串/字符数组时它会工作,而不是相反?在新的空字符串之前初始化/声明原始字符串时,函数似乎在修改原始字符串

实际上,我所做的只是交换初始化/声明数组的顺序


(正在使用的GCC/G++编译器不会针对任何情况给出任何警告或错误)

您需要分配空间来填充空字符串

像这样的空字符串

char emptyString[] = "";
大小为1字节,您无法调整其大小

这应该被理解为“声明一个数组并用
常量初始化它”,结果是一个大小为
1
的数组只包含
null
终止符


您需要通过明确指定大小来分配空间

char emptyString[10] = "";

现在这个数组允许复制到它。

您正在调用未定义的行为您正在做的是未定义的行为,C没有神奇地调整数组大小的超级功能。在研究字符串之前,您需要研究数组是如何工作的。基本上,你明白为什么
inta[]={0};int b[]={1,2,3};memcpy(a、b、sizeof(b))会崩溃并烧掉吗?因为这是同样的问题。请完成添加您的文字信息作为屏幕截图。您可以简单地复制和粘贴纯文本。您可以打印while循环中的两个数组,以便在每次迭代后准确地查看它们在数组中的位置。我会浏览一些教程@KlasLindbäck嗯。。。如何有意义地更改大小为1、只包含空终止符的C字符串?您所做的任何更改都将意味着数据不再是C字符串。@Stargateur是的,确实如此,当没有真正的性能或其他好处时,我讨厌不清楚的代码。