gpt4 book ai didi

C++ strcat 创建无限循环

转载 作者:行者123 更新时间:2023-11-30 05:20:32 25 4
gpt4 key购买 nike

我正在尝试创建一个数组,数组中的每个对象都应具有名称 Model(i),其中 is 是索引,我这样做是为了让它们的名称按降序索引 Model5、Model4 ... 我正在尝试使用 char[] 执行此操作,但出于某种原因,在我的代码中,在 for 循环中使用 strcat 使我陷入无限循环,如果有人可以提供帮助,第二点是以我可以连接的方式转换索引命名并提供给构造函数。

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

class CARRO {
public:
CARRO() {};
CARRO(char *modelo, unsigned ano);
char* getModelo();
unsigned getAno();
private:
char modelo[100];
unsigned ano;
};

void swap(int *p, int *q);
int partition(int *v, int start, int end);
int randomizedPartition(int *v, int start, int end);
void qsHelper(int *v, int start, int end);
void quickSort(int *v, int len);
void printList(CARRO *carros, unsigned len);

int main(int argc, char const *argv[]) {

CARRO carros[5];
unsigned len = sizeof(carros)/sizeof(CARRO);

for (int i = 0; i < len; ++i) {
char modelo[] = "Modelo";
char id[] = "I";
strcat(modelo, id);
unsigned ano = 1000 * (i+1);
carros[i] = CARRO(modelo, ano);
cout << carros[i].getModelo() << endl;
}

//printList(carros, len);

return 0;
}

CARRO::CARRO(char *modelo, unsigned ano) {
strcpy(this->modelo, modelo);
this->ano = ano;
}

如果我删除该行:

strcat(modelo, id);

循环工作正常。我只是不明白为什么 strcat 会以某种方式产生无限循环。输出是这样的:(带有 strcat 行)

ModeloI
ModeloI
ModeloI
ModeloI
ModeloI
ModeloI
ModeloI
ModeloI
ModeloI
ModeloI
^CModeloI

最佳答案

The loop works fine. I just cant understand why strcat is somehow generating an infinite loop. the output is this: (with the line strcat)

循环不能正常工作!你在浪费内存。让我们制作一些方框来表示您的程序可能看到的堆栈(让我们假设循环刚刚转到 1):

+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| char modelo[7] | int i | unsigned len |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 'M' | 'o' | 'd' | 'e' | 'l' | 'o' | 0 | 1 | 0 | 0 | 0 | 5 | 0 | 0 | 0 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+

所以当你这样做的时候:

strcat( modelo, id );

您最终会遇到缓冲区溢出一个字节的情况。在我的特定示例中,这会覆盖变量 i 的第一个字节,从而导致您的循环无限期地继续:

+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| char modelo[7] | int i |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 'M' | 'o' | 'd' | 'e' | 'l' | 'o' | 'I' | 0 | 0 | 0 | 0 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
^^^^^
Nul-terminator written

当然,我这样布置你的堆栈纯粹是为了举例。您的编译器可能不会像这样将堆栈保持在一起。在您的数组之后可能有额外的填充并且它可能恰好“工作”。变量 i 可能 保存在寄存器中而不是内存中,或者编译器可能 已完全展开循环。您的体系结构可能是大端(而不是我示例中的小端)。

重点是,结果行为是完全未定义的。我们不能只看这段代码就说会发生什么,即使您在您的机器上获得一致的结果也是如此。

所以要解决这个问题,您可以简单地使 modelo 足够大以存储字符串 "ModeloI" 包括终止符,这意味着使其足够大以存储 8 个字节而不是 7:

char modelo[8] = "Modelo";

然后您将定义行为,无论堆栈是按如下所示还是以任何其他方式布局:

+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| char modelo[8] | int i |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 'M' | 'o' | 'd' | 'e' | 'l' | 'o' | 'I' | 0 | 1 | 0 | 0 | 0 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+

关于C++ strcat 创建无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40621976/

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