打印动态字符串数组时崩溃

时间:2013-03-01 17:12:04

标签: c arrays string dynamic

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

2 个答案:

答案 0 :(得分:1)

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

假设可能会发生这种情况:

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

答案 1 :(得分:0)

你能检查输入文件吗?

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

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