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

C 打印动态字符串数组时崩溃,c,arrays,string,dynamic,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>

我在使用字符串数组时遇到问题。创建字符串数组时,我可以打印例如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;
}
#定义真1
#定义FALSE 0
#ifdef硕士学位
#定义\u CRT\u安全\u无\u警告
#恩迪夫
#包括
#包括
#包括
#包括
字符**全局;//纳姆万阿勒环球酒店
int*adressen;//阿迪斯范阿勒环球酒店
无符号整数索引;//普莱茨·沃尔·赫特·托沃根·凡·格洛帕尔斯酒店
int InitializeGlobals(char*path)
{
//瓦里贝伦·沃奥尔·贝斯特
结构统计;
文件*bestand;
//斯兰歌剧院的变奏曲
字符*缓冲区;
//变奏曲
无符号整数i;
无符号整数=0;
无符号字符b=FALSE;
//瓦里贝伦·沃奥尔·奥姆泽滕·范德缓冲区酒店
字符*数字;
未签名的int-grootte;
无符号整数起始;
无符号整数tmp;
//调试变量
int调试;
//缓冲区内的Bestand lezen en sluiten
//
//
bestand=fopen(路径“r”);
if(bestand==NULL){
printf(“Kon het optgeven bestand niet openen!globals.c/r42\n”);
返回-1;
}
debug=stat(路径和st);
如果(调试<0){
printf(“Kon het optgeven bestand niet analyzeren!globals.c/r48,返回:%i\n”,debug);
返回-2;
}
缓冲区=(char*)malloc(st.st_大小);
if(buffer==NULL){
返回-3;
}
fread(缓冲区,1,st.st_大小,最佳和);
fclose(bestand);
//他在克拉玛肯的一家酒店工作
//
//
对于(i=0;i<(无符号整数)st.st\U大小;i++){
if(缓冲区[i]='\n'&&b==FALSE){
aantal++;
}
否则{
b=假;
}
}
globals=(char**)malloc(sizeof(char*)*aantal);
肾上腺=(int*)malloc(sizeof(int*)*aantal);
//缓冲区omzetten naar de string数组“globals”en de int数组“adressen”
//
//
b=假;
指数=0;
开始=0;
对于(i=0;i<(无符号整数)st.st\U大小;i++){
如果(b==TRUE){
如果(缓冲区[i]='\n'){
b=假;
开始=i+1;
}
}
else if(缓冲区[i]==';'){
b=正确;
}
else if(缓冲区[i]='='='){
格罗特=(i-启动);
数字=(char*)malloc(grootte);
if(number==NULL){
返回i+1;
}
memcpy(编号、缓冲区+启动、grootte);
开始=i+1;
tmp=atoi(编号);
memcpy(&adressen[index],&tmp,4);//应用程序仅限x86
索引++;
免费(数字);
}
else if(缓冲区[i]='\n'){
格罗特=(i-启动);
全局[索引]=(字符*)malloc(格罗特+1);
if(全局[索引]==NULL){
返回i+1;
}
memcpy(全局[索引]、缓冲区+启动、grootte);
全局[index][grootte]='\0';
开始=i+1;
printf(“%s\n”,全局[索引]);
}
}
自由(缓冲);

printf(“%s”,globals[0]);//此
0xCDCDCDCD
解决调试运行时的标记方式。因此可以安全地假设globals[0]从未初始化

假设这可能会发生:


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

您可以检查输入文件吗

在代码中,您希望在globals[0]处获得输出,但会遇到崩溃


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

学习使用调试器(
gdb
在Linux上)并使用所有警告和调试信息进行编译(
gcc-Wall-g
在Linux上)。使用泄漏检测器(
valgrind
在Linux上)。为什么不提及异常文本?app.exe中0x614616B3(msvcr110d.dll)处未处理的异常:0xc00005:访问冲突读取位置0xcdcdcdcdcd.wtb a nullchar终止符(在本例中为多个)。不能强制转换malloc的返回值。