首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >malloc一个二维数组,其中每个条目都是一个字符串,用C

malloc一个二维数组,其中每个条目都是一个字符串,用C
EN

Stack Overflow用户
提问于 2012-01-23 05:59:11
回答 3查看 1.6K关注 0票数 3

我正在尝试在C中malloc一个二维数组,其中每个条目都是一个字符串(所以,我认为是一个三维数组)。我读了很多书,这就是我的尝试。然而,我遇到了一个分段错误,我真的不确定哪里出了问题。我是编程新手,所以如果我的风格不好,我很抱歉!

代码语言:javascript
复制
#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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-23 06:03:28

您永远不会为实际的字符分配任何内存,只为指向那些所需字符的各种指针分配内存。在此处添加分配:

代码语言:javascript
复制
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是一个更有用的函数。

票数 2
EN

Stack Overflow用户

发布于 2012-01-23 06:04:26

您的问题出在像strcpy(S[0][i-2], argv[i]);这样的行中。你没有给这个字符串分配空间,它是垃圾指针。请改用S[0][i-2]=strdup(argv[i])

票数 1
EN

Stack Overflow用户

发布于 2012-01-23 06:05:50

这段代码中有很多内存错误。有时你没有恶意锁定就释放了,有时你复制字符串而不检查它们的大小(所以字符串对于目的地来说可能太大了),而且你从来没有真正为字符串分配内存。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8965095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档