c++ - 为什么这个char指针的计数会得到不同的结果?
问题描述
写相同的东西,但功能不同,我得到了两个不同的结果。
我正在尝试逐个字母地创建一个char数组,然后将其放入char **v中。如您所见,我在 create_vect() 和 main() 函数中都有 cout v[i],如果我运行代码,每次都会得到不同的结果。我很困惑。为什么会这样,我可以做些什么来解决它,以便我第二次也得到“000”作为我的目标?
#include <string.h>
#include <math.h>
using namespace std;
void create_vect( char **&v){
v=new char*[3];
for (int i=0;i<3;i++){
char wordd[4];
wordd[0]='0';
wordd[1]='0';
wordd[2]='0';
wordd[3]='\0';
v[i]=wordd;
cout<<endl<<v[i]; //here I get the right thing
}
}
int main(){
char **v;
create_vect(v);
for (int i=0;i<3;i++){
cout<<endl<<v[i]; //here i get something weird ascii sign
}
}
编辑:我的错,我只是想把它翻译成英文,这样更容易看到我的代码目标是什么,我错过了一个词。我非常感谢您的帮助,因为我需要对其进行哪些更改才能使其正常工作。我有点失落。谢谢你,再次为我的粗心错误感到抱歉。
解决方案
当您调用create_vect
并进入循环时,您会在堆栈上for
创建一个wordd
类型的变量。char[4]
但它的生命周期只是for
循环的一次迭代。随着您分配tov[i]=wordd;
的第一个元素的地址。数组衰减为指向第一个元素的指针。只要变量存在,就可以打印。但是当您在生命周期结束后尝试访问内存时,您会得到未定义的行为。有时您的程序可以按预期工作,有时它会打印垃圾。wordd
v[i]
wordd
要解决您的问题,您可以在堆上使用动态内存分配,也可以使用类似 stl 的容器std::vector<std::string>
(它可能使用动态内存分配并按值复制)。记得清理动态分配的内存。
此外,您不应在 c++ 代码中使用 c 标头(math.h、string.h)。使用 cmath、cstring。不要使用 using namespace std;。使用 std::cout, std::endl, ...
#include <cstring>
#include <cmath>
#include <iostream>
void create_vect(char **&v) {
v=new char*[3];
for (int i = 0; i < 3; ++i) {
v[i] = new char[4];
v[i][0]='0';
v[i][1]='0';
v[i][2]='0';
v[i][3]='\0';
std::cout << std::endl << v[i]; //here I get the right thing
}
}
int main(){
char **v;
create_vect(v);
for (int i = 0; i < 3; ++i) {
std::cout << std::endl << v[i]; //here i get something weird ascii sign
}
// Clean-up
for (int i = 0; i < 3; ++i) {
delete[] v[i];
}
delete[] v;
return 0;
}
推荐阅读
- mysql - 相同的两个表之间是否可以有多个多对多关系?
- python - 是否可以让用户不 pip install modules 而是包含在不同文件夹中使用的模块然后导入?
- python - 如何检查graphics.py中两个盒子之间的碰撞?
- python - 如何在 Django 中使用 OSMnx?
- google-cloud-platform - 在 AI Platform Prediction 上将模型部署到区域端点成功,但将相同模型部署到全局端点失败
- spring-boot - 使用可完成的未来调用外部 API 时,RequestContextHolder 为空
- ruby-on-rails - 参数丢失或值为空:消息
- google-app-engine - 不小心删除了 *.appspot.com 存储桶,如何恢复?
- installation - Typo3 v11 安装 - 尝试访问前端或后端时超时
- python - 使用 ElementTree 时在 lXML 中包含前缀