这是一个简单的程序,用于将字符串从C编程书中复制到新字符串(C,S.Kochan编程)。它运行正常,但有一个我看不到初始化的指针。我在这里挣扎着指点,但我已经在我的编码中嵌入了C黄金诫命:“你不要使用那些没有初始化的指针”。这是代码:
#include <stdio.h>
void copyString(char *to, char *from) //I do not see where the 'from' pointer is initilized?
{
for( ; *from != '\0'; ++from, ++to)
{
*to = *from;
}
*to = '\0';
}
int main(void)
{
void copyString (char *to, char *from);
char string1[] = "A string to be copied.";
char string2[50];
copyString(string2, string1);
printf("%s\n", string2);
copyString(string2, "So is this.");
printf("%s\n", string2);
return 0;
}
我的印象是必须以下列方式初始化所有指针:
*ptr = &variable;
或冒着被覆盖的系统重要的风险。但我看到我书中的许多程序没有明确初始化指针,这让我非常不舒服。请给我一些关于谨慎指针使用的提示,这样我就不会破坏我的机器,尤其是与字符串有关的任何东西。在此先感谢所有人!
答案 0 :(得分:1)
这会让您感到困惑 - void copyString (char *to, char *from);
。这只是main
中的声明。 char *to
中的char *from
和main
未使用,所以请不要担心。上面的代码和:
#include <stdio.h>
void copyString(char *to, char *from) //I do not see where the 'from' pointer is initilized?
{
for( ; *from != '\0'; ++from, ++to)
{
*to = *from;
}
*to = '\0';
}
int main(void)
{
void copyString (char *, char *);
char string1[] = "A string to be copied.";
char string2[50];
copyString(string2, string1);
printf("%s\n", string2);
copyString(string2, "So is this.");
printf("%s\n", string2);
return 0;
}
//I do not see where the 'from' pointer is initilized?
当你传递像copyString(string2, string1);
这样的参数时 - 它们将被复制到copyString(char *to, char *from)
函数调用的args中。所以在第一次电话会议中:
copyString(string2, string1);
- to
= string2
,from
= string1
"A string to be copied."
from--^
在第二个电话中:
to
= string2
,from
= "So is this."
"So is this."
from--^
string2
不会导致任何问题(即使它没有被初始化),因为你覆盖了它的值(之前有垃圾值)。
答案 1 :(得分:1)
to
和from
是函数参数,当调用函数时,会为它们分配参数的值:
copyString(string2, string1);
to
的值为stirng2
,而from
的值为string1
。请注意,即使string2
和string1
具有char
数组的类型,但它们在作为函数参数传递时会“衰减”为指向第一个元素的指针。
答案 2 :(得分:1)
你是对的 - 所有指针都必须按你所说的那样初始化。
当您声明字符串时,如下面的字符数组:
char string1 [] =“要复制的字符串。”; char string2 [50];
string1和string2是指向字符串数组的指针。所以,它们已经是指针。 当你在copyString函数中使用它们时,你已经在使用指针,并且隐含地完成了assignent。所以:
to = string2 =&amp; string2 [0];
答案 3 :(得分:1)
以下是代码的注释版本 - “from”变量已重命名为source,而指针值的printf应说明源代码。但是可以说,copyString函数的参数是由主程序中对函数的两次调用提供的。编译器生成的代码使用您在函数调用中提供的参数以及将这些参数保存到函数调用堆栈帧的指令。然后,当调用该函数时,函数中会引用这些值。
#include <stdio.h>
//the char pointer dest is provided as an argument
//the char pointer source is provided as an argument
char*
copyString(char *dest, char *source)
{
if(!dest) return dest;
if(!source) return dest;
printf("dest %x, source %x\n", dest, source);
//for each character in source, until *source == '\0'
for( ; *source; )
{
//assign the char at *dest into *source
//then post-increment source, dest
*dest++ = *source++;
}
//ensure the dest string is terminated
*dest = '\0';
return dest;
}
int main(void)
{
char* copyString (char *to, char *source);
char string1[] = "A string to be copied.";
char string2[50];
printf("string2 %x, string1 %x\n", string2, string1);
copyString(string2, string1);
printf("%s\n", string2);
copyString(string2, "So is this.");
printf("%s\n", string2);
return 0;
}
运行程序时,您将看到提供的源指针和目标指针的位置,
$ ./copystr
string2 bff0dbe7, string1 bff0dc19
dest bff0dbe7, source bff0dc19
A string to be copied.
dest bff0dbe7, source 80485f0
So is this.