c++ - 100% 的数组在函数中正确,75% 的数组在 CALLING 函数中正确 - C

标签 c++ c arrays struct output

注意:我使用的是 C++ 编译器,因此我可以使用引用传递

我有一个奇怪的问题,我真的不知道发生了什么。

基本上,我有一个文本文件:http://pastebin.com/mCp6K3HB 我正在将文本文件的内容读入原子数组:

typedef struct{
    char * name;
    char * symbol;
    int atomic_number;
    double atomic_weight;
    int electrons;
    int neutrons;
    int protons;
} atom;

这是我对原子的类型定义。

void set_up_temp(atom (&element_record)[DIM1])
{
    char temp_array[826][20];
    char temp2[128][20];
    int i=0;
    int j=0;
    int ctr=0;

    FILE *f=fopen("atoms.txt","r");

    for (i = 0; f && !feof(f) && i < 827; i++ ) 
    {
        fgets(temp_array[i],sizeof(temp_array[0]),f);
    }

    for (j = 0; j < 128; j++)
    {
        element_record[j].name = temp_array[ctr];
        element_record[j].symbol = temp_array[ctr+1];
        element_record[j].atomic_number = atol(temp_array[ctr+2]);
        element_record[j].atomic_weight = atol(temp_array[ctr+3]);
        element_record[j].electrons = atol(temp_array[ctr+4]);
        element_record[j].neutrons = atol(temp_array[ctr+5]);
        element_record[j].protons = atol(temp_array[ctr+6]);
        ctr = ctr + 7;
    }

    //Close the file to free up memory and prevent leaks
    fclose(f);
} //AT THIS POINT THE DATA IS FINE

这是我用来读取数据的函数。当我调试这个函数并让它一直运行到最后时,我使用调试器检查它的内容,并且数组有 100% 正确的数据,也就是说,所有元素都是它们应该相对于文本文件的内容。 http://i.imgur.com/SEq9w7Q.png这张图片显示了我在说什么。在左边,所有元素,从 0 到 127,都是完美的。 然后,我转到调用它的函数。

atom myAtoms[118];
set_up_temp(myAtoms); //AT THIS POINT DATA IS FINE
region current_button_pressed; // NOW IT'S BROKEN
load_font_named("arial", "cour.ttf", 20); 
panel p1 = load_panel("atomicpanel.txt");   
panel p2 = load_panel("NumberPanel.txt");

一旦调用任何东西,在我调用 set_up_temp 之后,数组中的元素 103 到 127 就会变成乱码。随着越来越多的东西被调用,甚至更多的数组变成了乱码。这很奇怪,我不知道发生了什么......有人知道吗?谢谢。

最佳答案

for (j = 0; j < 128; j++)
{
    element_record[j].name = temp_array[ctr];

您将指针存储并返回到堆栈上的 temp_array 中。从函数返回的那一刻,temp_array所有 都变得无效——在该点之后取消引用任何这些指针是未定义的行为。 “未定义的行为”包括您仍然可以毫无问题地读取元素 0 到 102 的可能性,但正如您所说,103 到 127 变成乱码。您需要为这些字符串分配与 atom 对象一样长的空间。既然你说你正在使用 C++,最简单的解决方法是将 char * 成员更改为 std::string。 (如果您不想使用 std::string,第二个最简单的解决方法是使用 strdup,但是您必须 free明确地内存。)

这可能不是此代码中的唯一错误,但它可能是导致您立即遇到问题的错误。

如果您好奇的话,数据的高端损坏的原因是在大多数(但不是所有)计算机上,包括您正在使用的计算机,堆栈会增长向下,即从高地址到低地址。然而,数组总是从低地址到高地址进行索引。因此,曾经是 temp_array 的内存区域的高端是调用者中最接近堆栈指针的部分,因此最有可能被后续函数调用覆盖。

关于c++ - 100% 的数组在函数中正确,75% 的数组在 CALLING 函数中正确 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16221062/

相关文章:

python - 如何压缩这个字符串压缩代码以使其更加高效?

c++ - 检查 4 个点是否构成一个正方形

c - If else语句c程序中的多个条件

c++ - While 循环走得太远了

c - POSIX C 进程间通信 (IPC) 示例可以工作,但不应该

html - 通过套接字下载 HTTP (C)

c - 数组参数上的 fgets()

objective-c - 如何将浮点值数组写入 Core Audio 中的音频文件?

c++ - 从另一个可变参数模板制作可变参数模板

c++ - 返回 *this 作为引用是否安全?