0

这是一个从 C 编程书籍(Programming in 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;

或冒着系统中重要的东西被覆盖的风险。但是我在我的书中看到许多程序没有明确地初始化指针,这让我很不舒服。请给我一些关于谨慎使用指针的提示,这样我就不会破坏我的机器,尤其是与字符串有关的任何东西。提前谢谢大家!

4

4 回答 4

1

这让你感到困惑 - void copyString (char *to, char *from);。这只是main. char *tochar *frominmain没有使用所以不用担心。上面的代码和以下代码一样好:

#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);- 它们将被复制到 args 的函数调用中copyString(char *to, char *from)。所以在第一次通话中:

copyString(string2, string1); - to= string2, 和, from=string1

     "A string to be copied."
from--^

在第二个电话中:

to= string2, 和, from="So is this."

     "So is this."
from--^

string2不会导致任何问题(即使它没有被初始化),因为您覆盖了它的值(之前有垃圾值)。

于 2013-10-29T01:53:04.570 回答
1

tofrom是函数参数,当函数被调用时,它们被赋予参数的值:

copyString(string2, string1);

to被赋予 的值stirng2from被赋予 的值string1。请注意,尽管string2andstring1具有char数组类型,但是当作为函数参数传递时,它们“衰减”为指向第一个元素的指针。

于 2013-10-29T01:55:56.663 回答
1

你是对的 - 所有指针都必须按照你所说的进行初始化。

当您声明字符串时,作为一个字符数组,如下所示:

char string1[] = "要复制的字符串。"; 字符字符串2[50];

string1 和 string2 是指向字符串数组的指针。所以,它们已经是指针。当您在 copyString 函数中使用它们时,您已经在使用指针,并且分配是隐式完成的。所以:

to = string2 = &string2[0];

于 2013-10-29T02:01:10.450 回答
1

这是您的代码的注释版本 - “from”变量已重命名为源,指针值的 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.
于 2013-10-29T02:19:59.640 回答