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

3

哎呀,指针一直让我头疼。我以为我理解了这个概念。(基本上,当你想要操作指针所指向的实际内存保存位置时,你会使用*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函数中,它将line的内容发送到指针的内容。难道不应该是:

strcpy( *pointer, *line);

还是我的指针理解有误,strcpy函数就是这样工作的吗?

11个回答

6
C风格字符串是字符字节的数组。当你将一个数组作为数组类型的指针传递时,指针包含数组第一个元素的地址。 strcpy函数接受源数组(即字符串的开头)的第一个char指针和目标数组中第一个char的指针,并迭代源数组直到找到终止字符串的'\0'字符。
这也是为什么在调用malloc时,你需要传递strlen(line)+1的大小,因为你需要为终止字符分配一个额外的字节(据我所知)。

目前为止,似乎只有一个回答解决了提问者的实际困惑。 - Aidan Cully

4

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

strcpy将获取指针sourcedestination,并将指向source的字符串中的底层字节复制到destination,直到它遇到\0(NULL)字节,或者如果它由于未遇到该字节(未终止的字符串)而导致分段错误并读取到深渊。

如果您使用*pointer,您实际上会对指针进行取消引用,并获得指针指向地址的char


1

strcpy的签名是

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

你正在发送一个 char* 类型的指针,以及另一个 char* 类型的变量 line。因此,你完全符合预期的签名。如果发送 *pointer 或 *line,那么就会发送“这些指针指向的值”,这是错误的。

1

看一下strpcy()的声明。

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

你需要传递一个指针。所以你不能解引用指针和行,因为那样会传递一个字符。

1

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


1

*strcpy 函数内部。

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

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

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


1
通过写*pointer,您可以获得它所指向的字符(它恰好是pointer表示的字符串的第一个字符)。将其传递给strcpy涉及创建该字符的副本。除非您提供指向该数据的指针,否则strcpy无法知道应该在哪里写入。
类似地,通过提供*line,您只是给strcpy一个字符串的第一个字符的副本。
因此,您基本上是在说:

我有两个字符串。我不会把它们给你。其中一个的第一个字母是C,另一个的第一个字母是µ。将第一个字符串的内容复制到第二个字符串中


0

将strcpy代码视为:

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

\0(NULL) 表示字符串和 for 循环的结尾。


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快。


0

我明白你为什么希望将*pointer*line传递给strcpy。但请记住,pointer指向存储内容的内存位置,其中有strlen(line)+1字节的内存被保留和分配。因此,strcpy实际上是从地址line开始复制strlen(line)个字节的内存到相应的位置,从pointer的地址开始。如果你传递*pointer*linestrcpy只能访问第一个char,而不是其余的strlen(line)-1个字符。希望这解释清楚了关于指针的困惑以及为什么我们需要将指针传递给strcpy


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接