我有这个程序:
#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/