我在使用字符串数组时遇到了麻烦。创建字符串数组时,我可以打印例如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;
}

最佳答案

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

推测可能发生的情况:

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

09-25 22:16