使用'strcpy'的基本C指针问题

时间:2010-10-13 17:37:17

标签: c pointers

男人,指针继续给我带来麻烦。我以为我理解了这个概念。(基本上,当你想操纵ptr指向的位置保存的实际内存时,你会使用* ptr。如果你想通过做这样的事情来移动指针,你会使用ptr作为ptr ++或ptr--。)所以,如果是这种情况,如果你使用星号来操纵指针所指向的文件,这是如何工作的:

char *MallocAndCopy( char *line ) {

    char *pointer;
    if ( (pointer = malloc( strlen(line)+1 )) == NULL ) {
        printf( "Out of memory!!!  Goodbye!\n" );
        exit( 0 );
    }
    strcpy( pointer, line );

    return pointer;
}

malloc返回一个指针,所以我理解为什么if条件中的“指针”不使用星号。但是,在strcpy函数中,它将行的CONTENTS发送到指针的CONTENTS。不应该是:

strcpy( *pointer, *line);

?????或者我对指针的理解是正确的,这只是strcpy函数的工作方式吗?

11 个答案:

答案 0 :(得分:6)

C样式字符串是字符字节数组。当您将数组作为指向数组类型的指针传递时,指针包含数组的第一个元素的地址。

strcpy函数将指针指向源数组的第一个char(字符串的开头)和指向目标数组中第一个char的指针,并遍历源,直到它到达'\0'字符,终止字符串。

这也是为什么当你调用malloc时,你传递给它的大小是strlen(line)+1,因为你需要为终止字符再分配一个字节(据我所知)。 / p>

答案 1 :(得分:4)

char* strcpy(char *destination, const char *source)strcpy的签名。它希望得到指针作为参数。在您的实例中,pointer已经是指针,line也是如此。

strcpy将使用指针sourcedestination,并将指向source的基础字节复制到destination,直到它遇到\0source指向的字符串中的1}}(NULL)字节,或者如果它因为从未遇到该字节(未终止的字符串)并且只是读入深渊而发生分段错误。

如果你使用*pointer,你实际上会取消引用指针并在指针所指向的地址处获得char

答案 2 :(得分:1)

strcpy的签名是

char * strcpy ( char * destination, const char * source );

您正在发送指向char *的指针,以及也是char *的行。因此,您完全按预期匹配签名。发送*指针或*行将发送'这些指针指向的值' - 这将是错误的。

答案 3 :(得分:1)

scrcpy接受一个指针,并将内容写入指向另一个指针所指向的位置。这就像重写表格中的单元格内容一样。您不一定要剪切和粘贴表的一部分,您可以重写其中的数字。在这种情况下,指针只是提示您必须触摸的单元格。

答案 4 :(得分:1)

查看strcpy()的声明。

char *strcpy(
   char *strDestination,
   const char *strSource 
);

您需要传递指针。因此,您不要取消引用指针。因为那会传递一个字符。

答案 5 :(得分:1)

*位于strcpy内。

应用*运算符称为解除引用,与应用[0]完全相同。

strlenstrcpy需要知道字符串的开始位置,以便他们可以访问所有元素,而不仅仅是第一个元素。

pointer的类型为char **pointer的类型为char,表示没有相邻字符概念的单个字符。

答案 6 :(得分:1)

通过编写*pointer,您可以获得它指向的字符(恰好是pointer表示的字符串的第一个字符)。将其传递给strcpy涉及创建该角色的副本。 strcpy不可能知道它应该写在哪里,除非你给它一个指向那个数据的指针。

以类似的方式,通过提供*line,您只给strcpy一个字符串第一个字符的副本。

所以,你基本上是在说:

  

我有两个字符串。我没有把它们交给你。一个的第一个字母是C,另一个的第一个字母是μ。将第一个内容复制到第二个

答案 7 :(得分:0)

我知道您希望将*pointer*line传递给strcpy的原因。但请记住pointer指向内存中存储内容的位置以及保留和分配strlen(line)+1字节内存的位置。因此strcpy正在做的是将strlen(line)字节的内存从地址line开始复制到相应的位置,从pointer的地址开始。如果您通过*pointer*line,则strcpy只能访问第一个char,而不能访问其他strlen(line)-1。希望澄清你对指针的困惑以及为什么我们需要将指针传递给strcpy

答案 8 :(得分:0)

您对strcpy的基本理解是正确的。该函数确实将line的内容复制到pointer的内容上。但是,您必须将指针传递给函数而不是数据本身。这样做有几个原因。

首先,正在复制的数据是字符串(即数组),而不是常规变量。将数组传递给函数时,不能将整个数组塞入单个函数参数中,因此必须将指针传递给数组的开头。这是C中传递数组的限制,并不是strcpy特有的。

此外,将数据传递给函数会为函数提供变量内容的副本。如果您直接将数据(或取消引用的指针)传递给strcpy,则该函数将使用副本而不是原始数据。它将无法将数据写入原始字符串。

基本上,通过将指针移交给strcpy,您可以告诉它源数据和目标的位置。该函数在内部处理所有的解引用。在人类语言中,对strcpy的调用可以被认为是“从内存地址line开始的字符串,并从内存地址pointer开始写一个副本”。要传递内存地址,请使用指针。

答案 9 :(得分:0)

将strcpy代码视为:

char * strcpy(char * dst, char* src) 
{
    int i = 0 ;
    for (;dst[i]=source[i++];);
    return dst ;
}

\ 0(NULL)是字符串和for循环的结束。

答案 10 :(得分:0)

您的功能基本上是strdup的功能。该函数在许多平台上定义,如果不是,您可以这样定义:

char * my_strdup(const char* s)
{
  size_t len = strlen(s);
  char *r = malloc(len+1);
  return r ? memcpy(r, s, len+1) : NULL;
}

对于更长的字符串,memcpy通常比strcpy更快。