2012-03-17 35 views
-4

我是C新手,不明白为什么第一个函数可以工作,但不是第二个函数。为什么不能使用这个功能?

1:

int main(int argc, char** argv) { 
    char charTest[80] = "this is a test"; 
    char *test = &charTest; 
    strcpy(test, "one"); 

    printf("%s", test); 

    return (EXIT_SUCCESS); 
} 

第二:

int main(int argc, char** argv) { 
    char *test; 
    test = malloc(80); 
    strcpy(test, "one"); 

    printf("%s", test); 

    return (EXIT_SUCCESS); 
} 

有人能告诉我为什么? 谢谢;):)。

+11

它以什么方式*不工作*? – trojanfoe 2012-03-17 23:02:02

+0

第一个功能也有一些有趣的业务 - 你确定它有效吗?它当然不应该没有警告地编译。 – 2012-03-17 23:03:41

+0

......你有没有落后? C的所有迹象都告诉我第二个几乎可以工作,但不是第一个,但你表明了相反的意思。我可以在C中提供关于指针的详细答案,但如果它不是你想要的,我宁愿不要。 – FrankieTheKneeMan 2012-03-17 23:04:19

回答

1

第一个示例不应该编译,因为您试图使用&charTest,其类型为char (*)[80]以初始化char*。你大概的意思是:

char *test = &charTest[0]; 

或者:

char *test = charTest; 

在第二种情况下,当您使用数组的名称作为右值表达式,它衰减为指针第一个元素。也就是说,编译器会将其隐式转换为更加明确的版本:&charTest[0]

第二个例子只在C中编译,如果你在C中工作,你应该问C语言问题,不要用C++标记它们。在C++中它是一个错误,因为你需要显式转换到开启的malloc结果(这是一个void*)成char*

char * test = static_cast<char*>(malloc(80)); // awkward C++ 

在该第二程序,你正在泄漏存储器(阉羊在C或C++) 。您应该free您动态分配的内存。