malloc 2D-массив, где каждая запись является строкой, в C - PullRequest
3 голосов
/ 23 января 2012

Я пытаюсь распределить 2-мерный массив в C, где каждая запись является строкой (так что, я полагаю, 3-мерный массив).Я много читал, и это моя попытка.Тем не менее, я получаю ошибку сегментации, и я действительно не уверен, что не так.Я довольно новичок в программировании, поэтому я прошу прощения, если мой стиль не хорош!

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

int main(int argc, char *argv[])
{
    double temp, int_check;
    int gen, exit_flag=0, valid_input, valid, i, j;

    char ***S;

    printf("argc %d\n", argc);
    if(argc < 2)
    {
        printf("Please enter command line arguments of the form: a R where a is the number of generators and R are relators\n");
    exit_flag = 1;
    }
    else
    {
        valid = sscanf(argv[1], "%lg", &temp);
        int_check = temp - (int)temp;
        valid_input = ((valid != 0) && (valid != EOF)) && (int_check == 0) && (temp > 0);

        if(!valid_input)
        {
            printf("Invalid input, the number of generators must be an integer > 0\n");
            exit_flag = 1;
        }
        gen = (int)temp;

        printf("Number of generators = %d\n", gen);
    }

    if(exit_flag==0)
    {

        S = (char***)malloc(2*sizeof(char**));      /*Defintes the grid to the size required*/
        if(S == NULL) 
        {
            printf("Cannot allocate memory for the S");
        }

        for(i=0; i<2; i++)
        {
            S[i] = (char**)malloc((argc-2)*sizeof(char*));
            if(S[i] == NULL)
            {
                printf("Cannot allocate memory for the S");
            }
        }                                                   /*Grid finished being given the right size*/

        for(i=2; i<argc; i++)                               /*Put the relators in the grid. Make rhs equal 1*/
        {
            strcpy(S[0][i-2], argv[i]);
            strcpy(S[1][i-2], "1");
            printf("relator %s\n", S[0][i-2]);
        }

        printf("The array S is\n");
        for(j=0; j<(argc-2); j++)
        {
            for(i=0; i<2; i++)
            {
                printf(" %s ", S[i][j]);
            }
            printf("\n");
        }
    }

    else    /*If the inputs are invalid, exit the program*/
    {
        exit(EXIT_FAILURE);
    }

    for(i=0; i<2; i++)
    {
        free(S[i]);
    }
    free(S);

    return 0;
}

Ответы [ 3 ]

2 голосов
/ 23 января 2012

Вы никогда не выделяете память для реальных символов, только для различных указателей, указывающих на эти нужные символы. Добавьте распределение здесь:

for(i=2; i<argc; i++)        /* Put the relators in the grid. Make rhs equal 1*/
{
    S[0][i-2] = malloc(strlen(argv[i]) + 1);  // allocate memory for the data
    strcpy(S[0][i-2], argv[i]);
    strcpy(S[1][i-2], "1");
    printf("relator %s\n", S[0][i-2]);
}

Не забудьте в конце освободить весь бардак.

Я не уверен, что повторяющиеся strcpy делают то, что вы хотите; strcpy добавляет нулевой терминатор, поэтому ваша строка на этом заканчивается. Возможно, strncpy - более полезная функция для вашей ситуации.

1 голос
/ 23 января 2012

Ваша проблема в строках типа strcpy(S[0][i-2], argv[i]);. Вы не выделяли место для этой строки, и это указатель мусора. Вместо этого используйте S[0][i-2]=strdup(argv[i]).

0 голосов
/ 23 января 2012

В этом коде много ошибок памяти.Иногда вы освобождаетесь без malloc'ing, иногда вы копируете строки без проверки их размера (поэтому строка может быть слишком большой для места назначения), и вы фактически никогда не выделяете память для строк.

...