簡體   English   中英

Malloc for char** 導致頂部大小損壞

[英]Malloc for char** results in a corrupted top size

我正在為我正在制作的應用程序制作一個配置閱讀器。 我要修復的是,每當我向配置添加另一個條目“{}”時,它都會破壞應用程序。 我已經查明了問題所在,但不知道如何與 go 聯系。

C (config.c):

#include <config.h>

struct Config read_config(char * cfg) {
    struct Config newCfg;
    newCfg.valuesSize = 0;
    int configIsMalloc = 0;

    char * config;
    if (file_exists(cfg)==0) { 
        config = cfg;
    }
    else {
       config = read_file(cfg);
       configIsMalloc=1;
    }

    newCfg.values = (char****)malloc(sizeof(char****)*strlen(config));
    int valuesPtr = 0;
    int needsMalloc = 1;

    while(config) {
        char * nextLine = strchr(config, '\n');
        if (nextLine) *nextLine = '\0';

        printf("%s\n", config);

        if (config[0] == '{') {
            if (needsMalloc==0) {
                //newCfg.values[newCfg.valuesSize] = (char***)realloc(newCfg.values[newCfg.valuesSize], newCfg.valuesSize*(sizeof(char***)*sizeof(config)));
            }
            else {
                newCfg.values[newCfg.valuesSize] = (char***)malloc(sizeof(char***)*strlen(config));
                needsMalloc=0;
            }
        }
        else if (strstr(config, "}")) {
            newCfg.valuesSize++;
            valuesPtr=0;
        }

        // The culprit lies here...
        else if (strstr(config, ":")) {
            newCfg.values[newCfg.valuesSize][valuesPtr] = (char**)malloc(1000);

            char * split = strtok(config, ":");
            newCfg.values[newCfg.valuesSize][valuesPtr][0] = (char*)malloc(strlen(split)*sizeof(char));
            strcat(newCfg.values[newCfg.valuesSize][valuesPtr][0], split);

            split = strtok(NULL, ":");
            newCfg.values[newCfg.valuesSize][valuesPtr][1] = (char*)malloc(sizeof(split)*sizeof(char));
            strcat(newCfg.values[newCfg.valuesSize][valuesPtr][1], split);
            valuesPtr++;
        }

        if (nextLine) *nextLine = '\n';
        config = nextLine ? (nextLine+1) : NULL;
    }

    (configIsMalloc==1) ? free(config) : NULL;
    return newCfg;
}

config.h定義了存儲配置信息的結構C(config.h):

#ifndef CONFIG_H
#define CONFIG_H

#include <string.h>
#include <stdlib.h>
#include <files.h>

struct Config {
char *** values;
int valuesSize;
};

struct Config read_config(char * cfg);

#endif

這包含供配置讀取器獲取的信息這是從我的程序測試配置中的文件中讀取的:

{
ID:001
TITLE:Russian Spy Infiltration
DESCRIPTION:Those darn russian spies have done it again.
}

{
ID:002
TITLE:American Enthusiasts
DESCRIPTION:America!!!!!
}

打印的錯誤


{
ID:001
TITLE:Russian Spy Infiltration
DESCRIPTION:Those darn russian spies have done it again.
}
{
ID:002
malloc(): corrupted top size
fish: Job 1, './bm' terminated by signal SIGABRT (Abort)

編輯:我沒有使用 sizeof(),而是用 strlen() 替換了它們

        newCfg.values[newCfg.valuesSize][valuesPtr][0] = (char*)malloc(sizeof(split)*sizeof(char));

為什么sizeof(split) 這與sizeof(char*)相同,這顯然是錯誤的。 您是要使用strlen嗎?

此外,給定`

struct Config {
char *** values;
int valuesSize;
};

char * config;

這條線有兩個問題:

newCfg.values = (char****)malloc(sizeof(char****)*sizeof(config));`

首先, sizeof(config)pointer的大小,而不是它指向的內容(它指向一個大小為 1 的char ...)。 您可能想要strlen() 或許。

而且您正在使用sizeof(char****)即使values是一個char *** 這不會對大多數系統的大小造成問題,但它仍然是錯誤的。 如果您遵循該模式,如果* s 較小,則會導致嚴重問題。

許多人會說還有第三個問題—— 您沒有在 C 中轉換malloc()的返回值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM