Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+上带有malloc的字符串数组+;_C++_Arrays_String_Malloc_Void - Fatal编程技术网

C++ C+上带有malloc的字符串数组+;

C++ C+上带有malloc的字符串数组+;,c++,arrays,string,malloc,void,C++,Arrays,String,Malloc,Void,出于我无法控制的原因列表,我需要创建一个字符串数组,该数组需要从void*指针引用。其思想是在C++中遵循以下模式: void* TP = malloc(sizeof (double) * SS); for (int i = 0; i < SS; i++) { ((double*) TP)[i] = IStringToDouble(Token[i]); } void*TP=malloc(双倍尺寸)*SS; for(int i=0;i代码中,指针将失效,通过该指针修改字符串将修改令牌<

出于我无法控制的原因列表,我需要创建一个字符串数组,该数组需要从void*指针引用。其思想是在C++中遵循以下模式:

void* TP = malloc(sizeof (double) * SS);
for (int i = 0; i < SS; i++) {
  ((double*) TP)[i] = IStringToDouble(Token[i]);
}
void*TP=malloc(双倍尺寸)*SS;
for(int i=0;i
其中Token是一个向量,SS是一个int。现在,使用该模板,我想从以下内容开始:

void* TP = malloc(sizeof (string) * SS);
for (int i = 0; i < SS; i++) {
  ((string*) TP)[i] = Token[i];
}
void*TP=malloc(字符串大小)*SS;
for(int i=0;i
我知道这是非常错误的,但是我从它开始尝试的所有修改都不起作用

有没有关于如何实现这一目标的建议?可能吗

我已经通过C++或StAdvExcel发现了关于C++的字符串数组的所有文档,但是没有一个涉及到从空引用数组的问题。< /P>
void* TP = malloc(sizeof (string) * SS);
for (int i = 0; i < SS; i++) {
  ((string*) TP)[i] = Token[i];
}
类似地,您需要先显式调用
字符串的析构函数,然后再
free()
数组来销毁字符串


之后,您需要通过显式调用
字符串的析构函数来销毁
字符串,然后
free()
数组。

您可以将任何指针转换为
void*
。您不需要使用
malloc
,也不需要将
void*
指针作为指向对象的唯一指针

考虑到这一点,为什么不这样做呢

string* TP = new string[SS];
for (int i = 0; i < SS; i++) {
    TP[i] = Token[i];
}

void *TP2 = TP;

不过,在第二种方法中,如果向
标记添加更多元素,指针将无效,并且通过此指针修改字符串将修改
标记中的字符串(因为这是指针所指向的)。

您已经可以将任何指针转换为
无效*
。您不需要使用
malloc
,也不需要将
void*
指针作为指向对象的唯一指针

考虑到这一点,为什么不这样做呢

string* TP = new string[SS];
for (int i = 0; i < SS; i++) {
    TP[i] = Token[i];
}

void *TP2 = TP;


虽然第二种方法是,如果将更多的元素添加到令牌>代码中,指针将失效,通过该指针修改字符串将修改<代码>令牌< /C> >中的字符串(因为这就是指针指向的)。< /P>不要在C++中使用Maloc。特别是对于std::string.Hi Borgeader,我知道,任何关于满足void*指针请求的建议,无论是否使用malloc,都将非常有用。什么是

Token[I]
,以及如何访问字符串?嗨,Matt,Token是一个向量,因此Token[I]返回一个已经初始化的字符串。字符串将被其他只接受void*作为参数的函数使用,但这些函数具有引用位置和强制转换指针所需的所有信息。那么,您能让
TP
的指针指向该向量吗?而不是尝试分配新的字符串?不要在C++中使用MALLC。特别是对于std::string.Hi Borgeader,我知道,任何关于满足void*指针请求的建议,无论是否使用malloc,都将非常有用。什么是
Token[I]
,以及如何访问字符串?嗨,Matt,Token是一个向量,因此Token[I]返回一个已经初始化的字符串。字符串将被其他只接受void*作为参数的函数使用,但这些函数具有引用位置和强制转换指针所需的所有信息。那么,您能让
TP
的指针指向该向量吗?不是尝试分配新字符串?嗨,Tony,你准确地指出了我从内存分配中知道的未初始化字符串的错误。你能检查一下“新”行吗?这似乎是一个括号问题。非常感谢,它工作得非常完美,与我想到的原始模板非常相似。
&((string*)TP)[I]
简化为
I+(string*)TP
,顺便说一句。“你需要
以后以类似方式删除字符串。”-不,这将是未定义的行为。您分配了malloc(),因此必须释放()。但是,是的,您必须首先“销毁”(而不是
delete
)字符串,这可以通过在循环中显式调用它们的析构函数来实现。这直接引出了另一个问题:@JohnZwinck:是的,我太粗心了。谢谢你纠正这个答案。嗨,托尼,你准确地指出了我所知道的内存分配中未初始化字符串的错误。你能检查一下“新”行吗?这似乎是一个括号问题。非常感谢,它工作得非常完美,与我想到的原始模板非常相似。
&((string*)TP)[I]
简化为
I+(string*)TP
,顺便说一句。“你需要
以后以类似方式删除字符串。”-不,这将是未定义的行为。您分配了malloc(),因此必须释放()。但是,是的,您必须首先“销毁”(而不是
delete
)字符串,这可以通过在循环中显式调用它们的析构函数来实现。这直接引出了另一个问题:@JohnZwinck:是的,我太粗心了。谢谢你更正这个答案。嗨,伊米比斯,非常感谢你,它正是我想要的。在发布问题之前,我曾尝试过一种非常类似的解决方案,但使用不同的变量来强制转换TP数组产生了不同。一个
std::vector
newstring[]
要好得多。您可以使用
&TP[0]
TP.data()
获取指向
向量的第一个元素的指针。您好,immibis,非常感谢,它正是我想要的。在发布问题之前,我曾尝试过一种非常类似的解决方案,但使用不同的变量来强制转换TP数组产生了不同。一个
std::vector
newstring[]
要好得多。您可以使用
&TP[0]
TP.data()
获取指向
向量的第一个元素的指针。
void *TP = &Token[0];