char *数组以及如何为每个分配内存

时间:2014-08-27 16:31:25

标签: c malloc

我有一个非常简单的问题,我似乎无法弄明白。我有这个:

char* array[10];

所以,然后我在堆栈上有10个char*指针。现在我想做的就是为每个指针分配内存。如:

array[0] = malloc(sizeof(char)*6);

然后在这个位置存储一些字符:

strncpy(array[0], "hello", sizeof("hello")); 

然而,我在分配内存的第一步时遇到编译时错误:

error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]

但是它在预算Ideone处有效。

我做错了什么?我理解我尝试做什么,但我不明白为什么它不起作用。在array中的每个索引处都有一个char*。通过使用=符号,我试图将每个指针分配给分配给它的内存块。

我做错了什么? 使用g ++ -g -Wall

进行编译

5 个答案:

答案 0 :(得分:2)

  

我做错了什么?使用g ++ -g -Wall

进行编译

g ++始终将.c文件编译为.cpp。用C编译器(如GCC)编译它。在C ++中,您必须强制转换malloc的返回值。如果是C,do not cast return value of malloc

答案 1 :(得分:1)

您的代码是有效的C,但您正在将代码编译为C ++,其中,unike C,没有从void*char*的隐式转换。

如果您打算将代码编译为C(在这种情况下您不需要强制转换),请使用gcc,而不是g++。另外,请确保您的文件不会以gcc解释为C ++(.cpp.C.cxx.cc)的扩展名结尾。或者安全地使用.c扩展名。


如果要使代码有效C ++,则需要强制转换为char*

array[0] = (char*)malloc(sizeof(char)*6);

答案 2 :(得分:0)

这可能是C和C ++之间最明显的区别:C可以隐含地将void*返回的malloc()转换为任何其他类型,C ++不能。

现在,通过使用g++进行编译,或使用.cpp文件扩展名,您将代码编译为C ++代码,而不是C代码。请改用gcc,确保源文件以.c结尾,您的代码编译正常。

另一种解决方案是添加C ++需要的强制转换:array[0] = static_cast<char*>(malloc(sizeof(char)*6));

答案 3 :(得分:0)

正如其他人所指出的,C ++不允许从void *char *的隐式转换。

如果真的应该是C ++代码,我建议使用new而不是malloc进行动态内存分配,对于这个特定的代码,我建议使用{{1} } vector而不是string的数组:

char *

#include <vector> #include <string> ... std::vector< std::string > array; ... array[0] = "hello"; // literal is implicitly converted to an instance of string string实现为您完成所有内存管理。

如果这确实是C代码,只需使用vector而不是gcc进行编译。

答案 4 :(得分:0)

尝试这样的事情:

array[0] = static_cast<char *>(malloc(sizeof(char)*6));

How should I cast the result of malloc in C++?