我有一个非常简单的问题,我似乎无法弄明白。我有这个:
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
进行编译答案 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));