gpt4 book ai didi

C++ 为什么这个按引用传递的数组会产生运行时错误?

转载 作者:太空宇宙 更新时间:2023-11-04 14:43:05 25 4
gpt4 key购买 nike

void pushSynonyms (string synline,  char  matrizSinonimos [1024][1024]){


stringstream synstream(synline);

vector<int> synsAux;


int num;

while (synstream >> num) {synsAux.push_back(num);}


int index=0;
while (index<(synsAux.size()-1)){

int primerSinonimo=synsAux[index];
int segundoSinonimo=synsAux[++index];
matrizSinonimos[primerSinonimo][segundoSinonimo]='S';
matrizSinonimos [segundoSinonimo][primerSinonimo]='S';

}

}

和电话..

char matrizSinonimos[1024][1024];
pushSynonyms("1 7", matrizSinonimos)

通过引用传递 matrizSinonimos 对我来说很重要。

编辑:去掉了 &matrizSinonimos 中的 &。

编辑:运行时错误是:

An unhandled win32 exception occurred in program.exe [2488]![alt text][1]

最佳答案

有什么问题

您那里的代码 - 我找不到错误。我发现的唯一问题是,如果您根本不提供数字,那么这部分会造成伤害:

(synsAux.size()-1)

它将从 0u 中减去 1。这将环绕,因为 size() 返回一个无符号整数类型。您最终会得到一个非常大的值,大约在 2^16 或 2^32 左右。您应该将整个 while 条件更改为

while ((index+1) < synsAux.size())

您可以尝试在调用端查找错误。通常情况下,在此之前的某处会发生缓冲区溢出或堆损坏,并且程序会因此在稍后的某个时间点崩溃。

其中的参数和参数内容

关于数组及其传递方式,我认为您做得很好。虽然,您仍然按值传递数组。也许你已经知道了,但我会重复一遍。您实际上传递了一个指向该数组第一个元素的指针:

char matrizSinonimos[1024][1024];

二维数组实际上是数组的数组。该数组的第一个元素是一个数组,指向它的指针是一个指向数组的指针。在这种情况下,它是

char (*)[1024]

即使在参数列表中你说你接受一个数组数组,编译器一如既往地调整它并使它成为指向这样一个数组的第一个元素的指针。所以实际上,在编译器完成参数类型的调整之后,您的函数具有原型(prototype):

void pushSynonyms (string synline,  char (*matrizSinonimos)[1024]);

尽管经常有人建议,您不能将该数组作为 char** 传递,因为被调用的函数需要内部维度的大小,才能正确处理子维度在正确的偏移量。在被调用函数中使用 char**,然后编写类似 matrizSinonimos[0][1] 的代码,它将尝试解释第一个 sizeof(char** ) 该数组的字符作为指针,并将尝试取消对随机内存位置的引用,然后再执行一次,如果它没有在两者之间崩溃。 不要那样做。您在该数组的外部维度中写入的大小也无关紧要。它合理化了。现在,通过引用传递数组并不重要。但是如果你想,你必须把整个事情改成

void pushSynonyms (string synline,  char (&matrizSinonimos)[1024][1024]);

按引用传递不传递指向第一个元素的指针:保留所有维度的所有大小,传递的是数组对象本身,而不是值。

关于C++ 为什么这个按引用传递的数组会产生运行时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/469892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com