我目前正在玩把char数组传递给char指针。我看到的许多示例都显示了在将char数组复制到字符串指针之前,如何需要分配该字符串指针将使用的内存。复制时,您遍历数组以将每个地址存储到分配的char指针中。
在下面的示例中,我没有初始化char指针,也没有迭代数组。我只是传递第一个元素的指针。
int main()
{
char c[10] = "something";
// char* new_c = (char *)malloc(strlen(c)+1);
char *new_c = NULL;
new_c = c;
printf("%s", new_c);
return 0;
}
为什么new_c
仍在打印整个字符串?人们为什么还要遍历整个数组进行复制呢?
答案 0 :(得分:3)
运行该程序,您将清楚了解正在发生的事情
#include <stdio.h>
#include <string.h>
int main(void) {
char c[10] = "something";
char *new_c = NULL;
char new_c_2[10] = "";
new_c = c; // copies address of 'c' to 'new_c'
for(int i=0; c[i]!='\0'; i++) {
new_c_2[i] = c[i]; // copies value of 'c' to 'new_c_2'
}
// Data before changing the value of 'c'
printf("\nData before changing the value of \'c\'\n");
printf("new_c = %s\n", new_c);
printf("new_c_2 = %s\n", new_c_2);
strcpy(c, "changed");
// Data after changing the value of 'c'
printf("\nData after changing the value of \'c\'\n");
printf("new_c = %s\n", new_c);
printf("new_c_2 = %s\n", new_c_2);
return 0;
}
输出:
Data before changing the value of 'c'
new_c = something
new_c_2 = something
Data after changing the value of 'c'
new_c = changed
new_c_2 = something
字符* new_c = NULL; new_c = c;
这些语句仅将'new_c'指向'c'的地址。 因此,如果您更改'c'的值并使用'new_c',它将转到'c'的地址并提供更新后的值。
我们将字符串复制到另一个字符串中,以便即使更改'c'的值也可以使用旧值。
有关更多详细信息,请参阅C编程中的按值调用和按引用调用。
答案 1 :(得分:1)
您说“我不初始化char指针”。您可以使用
new_c = c;
数组c
会衰减为一个指针,就像您将c
直接传递给printf
一样。然后printf
遍历数组直到找到零终止符。
答案 2 :(得分:0)
人们为什么还要遍历整个数组进行复制呢?
好吧,也许要确保一段时间后不会删除/覆盖原始参考。
例如,如果原始缓冲区是本地/自动变量,则从函数返回后将无效。
或者如果我只是做c[0] = '\0';
。 new_c
现在不显示任何内容,因为我只是杀死了字符串的唯一副本。
根据用例,复制和通过“浅”指针引用另一个字符串都是有用的。