2013-03-01 52 views
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; 
} 
+0

学习使用调试器(Linux上的'gdb')并编译所有警告和调试信息('gcc -Wall - g'在Linux上)。使用泄漏检测器(Linux上的'valgrind')。 – 2013-03-01 17:14:29

+2

为什么你不提例外文本? – 2013-03-01 17:14:55

+0

app.exe中的0x614616B3(msvcr110d.dll)未处理的异常:0xC0000005:访问冲突读取位置0xCDCDCDCD。 – para 2013-03-01 17:16:13

回答

1

0xCDCDCDCD地址标记uninitialized heap memory的调试运行时的方式。因此,假设globals [0]从未初始化是安全的。

假设到如何可能发生:

如果输入文件是空的,或者如果它有一个文本行该行不以新行终止,那么你将永远不会分配全局[0]。

0

你能检查输入文件吗?

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

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