str *中的char *和char []

时间:2015-08-04 05:33:49

标签: c arrays pointers strcpy

#include <stdio.h>
#include <stdlib.h>
void main()
{
    char  str[] ="asdfasdf";
    char *s;
     strcpy(s,str);
     printf("%s",s);
}

这段代码有什么问题?我搞乱了char *和char []?

2 个答案:

答案 0 :(得分:5)

您永远不会将s设置为值,因此您需要调用未定义的行为。 在你的情况下,s = strdup(str);可能会更好吗?

strcpy没有为您的副本分配空间 - 它假设您已经这样做了。 strdup为您分配内存。正如Jonathan Leffler在评论中指出的那样 - 如果你不想使用动态内存分配,你只需要一个足够大的&#34; chunk&#34;将字符串复制到。

在您的情况下,char *char[]类型可以互换使用,只是您的指针未设置为有效的任何内容(可以设置为任何内容),但是代码假定它是有效的。

答案 1 :(得分:0)

char *s;仅在一个字符指针中,并且当前没有指向任何有意义的内容。

  1. 您可以将s指向str,然后两者都会指向内存中的相同数组
  2. 您可以创建一个空字符数组char s[16],您可以在其中复制数组。在这种情况下,sstr将是两个独立的数组,并将存在于堆栈中的不同内存地址中。
  3. 使用mallocstrdup分配一些内存以将字符串复制到其中。分配记忆就像拿出贷款一样。我们需要在计划结束时将其归还。确保使用它完成free指针。在这种情况下,两个数组位于不同的内存地址中,第一个位于堆栈中,第二个位于堆中。