为什么我应该将String声明为固定大小的数组

时间:2018-08-01 14:34:11

标签: c arrays string pointers

我有这个程序:

#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字符,这不行吗?

4 个答案:

答案 0 :(得分:4)

只要您为其分配存储空间,它就可以执行char* myStringCopy来工作。

例如

char* myStringCopy
myStringCopy = malloc(sizeof(char) * (strlen(myString)+1))

我可能会误认为+1,但我想是这样的。

答案 1 :(得分:3)

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还不够。字符串“ Hello there!”包含12个字符,但还包含一个终止的空字符。您必须为空字符提供空间。 char myStringCopy[12];似乎可以工作,但是copy_string实际上正在写超出数组的第13个字符,从而损坏了程序中的其他内容。

答案 2 :(得分:2)

问题是您没有足够的空间mystringCopy

您需要先预留空间:

   char* myString = "Hello there!";
   char* myStringCopy = malloc(strlen(myString) + 1);

答案 3 :(得分:1)

char* myStringCopy;

这只是指向char *的指针。开始复制之前,必须先为myStringCopy分配内存。当您这样声明时:

char myStringCopy[12];

编译器在堆栈中分配足够的内存。