我有这个程序:

#include<stdio.h>

void copy_string(char string1[], char string2[]){
    int counter=0;
    while(string1[counter]!='\0'){
        string2[counter] = string1[counter];
        counter++;
    }
    string2[counter] = '\0';
}

int main() {
   char* myString = "Hello there!";
   char* myStringCopy;
   copy_string(myString, myStringCopy);
   printf("%s", myStringCopy);
}


我的问题是,除非将myStringCopy声明为固定大小的变量(char myStringCopy[12];),否则它为什么不起作用?如果我在复制时在复制后添加\0字符,该方法不起作用吗?

最佳答案

char myStringCopy[12];告诉编译器创建一个由12个char组成的数组。将myStringCopy传递给copy_string时,此数组会自动转换为指向其第一个元素的指针,因此copy_string会接收一个指向字符的指针。

char *myStringCopy;告诉编译器创建指向char的指针。编译器会创建此指针,包括为其提供内存,但不会设置该指针的值。当此指针传递给copy_string时,copy_string不会收到有效值。

要使char *myStringCopy;工作,必须分配内存(使用malloc可以做到)。例如,您可以使用:

char *myStringCopy;
myStringCopy = malloc(13 * sizeof *myStringCopy);
if (myStringCopy == NULL)
{
    fprintf(stderr, "Error, the malloc did not work.\n");
    exit(EXIT_FAILURE);
}


另外,请注意12还不够。字符串“你好!”包含12个字符,但还包含一个终止的空字符。您必须为空字符提供空间。 char myStringCopy[12];似乎可以工作,但是copy_string实际上在数组之外写了第13个字符,损坏了程序中的其他内容。

关于c - 为什么我应该将String声明为固定大小的数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51636014/

10-10 04:36