首页 > 解决方案 > 为什么这个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
    }
}

编辑:我的错,我只是想把它翻译成英文,这样更容易看到我的代码目标是什么,我错过了一个词。我非常感谢您的帮助,因为我需要对其进行哪些更改才能使其正常工作。我有点失落。谢谢你,再次为我的粗心错误感到抱歉。

标签: c++

解决方案


当您调用create_vect并进入循环时,您会在堆栈上for创建一个wordd类型的变量。char[4]但它的生命周期只是for循环的一次迭代。随着您分配tov[i]=wordd;的第一个元素的地址。数组衰减为指向第一个元素的指针。只要变量存在,就可以打印。但是当您在生命周期结束后尝试访问内存时,您会得到未定义的行为。有时您的程序可以按预期工作,有时它会打印垃圾。worddv[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;
}

推荐阅读