我有这个程序:
#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
字符,这不行吗?
答案 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];
编译器在堆栈中分配足够的内存。