0

我在使用字符串数组时遇到问题。创建字符串数组时,我可以打印例如 globals[0] 的数据,但在函数结束时,应用程序在执行相同操作时会崩溃。有谁知道这是什么原因?

#define TRUE    1
#define FALSE   0

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

char** globals; // Naam van alle globals
int* adressen; // Adres van alle globals
unsigned int index; // Plaats voor het toevoegen van globals

int InitializeGlobals(char* path)
{
    // Variabelen voor het bestand
    struct stat st;
    FILE* bestand;

    // Variabelen voor de regels in op te slaan
    char* buffer;

    // Variabelen voor strings te tellen
    unsigned int i;
    unsigned int aantal = 0;
    unsigned char b = FALSE;

    // Variabelen voor het omzetten van de buffer
    char* number;
    unsigned int grootte;
    unsigned int start;
    unsigned int tmp;

    // Debug variabelen
    int debug;

    // Bestand in de buffer lezen en sluiten
    //
    //
    bestand = fopen(path, "r");
    if (bestand == NULL) {
        printf("Kon het opgegeven bestand niet openen! globals.c/r42\n");
        return -1;
    }

    debug = stat(path, &st);
    if (debug < 0) {
        printf("Kon het opgegeven bestand niet analyzeren! globals.c/r48, return: %i\n", debug);
        return -2;
    }

    buffer = (char*)malloc(st.st_size);
    if (buffer == NULL) {
        return -3;
    }

    fread(buffer, 1, st.st_size, bestand);
    fclose(bestand);

    // Het aantal strings vinden en de arrays klaarmaken
    //
    //
    for (i = 0; i < (unsigned int)st.st_size; i++) {
        if (buffer[i] == '\n' && b == FALSE) {
            aantal++;
        }
        else {
            b = FALSE;
        }
    }

    globals = (char**)malloc(sizeof(char*)*aantal);
    adressen = (int*)malloc(sizeof(int*)*aantal);

    // Buffer omzetten naar de string array "globals" en de int array "adressen"
    //
    //
    b = FALSE;
    index = 0;
    start = 0;
    for (i = 0; i < (unsigned int)st.st_size; i++) {
        if (b == TRUE) {
            if (buffer[i] == '\n') {
                b = FALSE;
                start = i+1;
            }
        }
        else if (buffer[i] == ';') {
            b = TRUE;
        }
        else if (buffer[i] == '=') {
            grootte = (i-start);
            number = (char*)malloc(grootte);
            if (number == NULL) {
                return i+1;
            }
            memcpy(number, buffer+start, grootte);
            start = i+1;
            tmp = atoi(number);
            memcpy(&adressen[index], &tmp, 4); // application is x86 only
            index++;
            free(number);
        }
        else if (buffer[i] == '\n') {
            grootte = (i-start);
            globals[index] = (char*)malloc(grootte+1);
            if (globals[index] == NULL) {
                return i+1;
            }
            memcpy(globals[index], buffer+start, grootte); 
            globals[index][grootte] = '\0';
            start = i+1;
            printf("%s\n", globals[index]);
        }
    }

    free(buffer);
    printf("%s", globals[0]); // <-- crash

    return 0;
}
4

2 回答 2

1

0xCDCDCDCD解决了调试运行时标记未初始化堆内存的方式。因此可以安全地假设 globals[0] 从未初始化。

假设这可能如何发生:

如果您的输入文件是空的,或者如果它有一行文本,该行不以换行符结尾,那么您将永远不会分配 globals[0]。

于 2013-03-01T17:45:12.290 回答
0

你能检查输入文件吗?

在代码中,您期望在 globals[0] 处输出,但会崩溃。

查看代码,索引变量在输入字符为“=”或“\n”时更新。检查文本文件是否在“\n”之前包含“=”。在这种情况下,索引将递增,并且 globals[] 永远不会在索引 0 处分配内存。

于 2013-03-01T17:46:29.607 回答