【问题标题】:problem with allocation of a pointer to pointer of char分配指向 char 指针的指针的问题
【发布时间】:2011-05-23 02:23:28
【问题描述】:

我编写了这段代码来将文件 'vetores' 的内容复制到 char 矩阵中,但我认为动态分配存在问题。有人可以帮助我吗?

void cpyarqvetores( char** arqvetores, FILE* varquivo);
void freearqvetores( char** arqvetores );

int main()
{
    FILE* varquivo;
    varquivo = fopen("vetores.txt", "r");
    char** arqvetores;
    arqvetores = (char**) malloc(10*sizeof(char*));
    cpyarqvetores( arqvetores, varquivo);
    printf("%s\n", *(arqvetores + 4));//try prints this line
    freearqvetores( arqvetores );
    fclose( varquivo );
    return 0;
}

//copy the contents of file 'vetores' to 'arqvetores'
void cpyarqvetores( char** arqvetores, FILE* varquivo){
    char aux[440];
    int strtam;
    int i, j;
    for( i = 0; i < 10; i++){
        fgets( aux, 440, varquivo);
        strtam = strlen( aux );
        *(arqvetores + i) = (char*) malloc(strtam*sizeof(char));
        if(*(arqvetores + i) == NULL)
            exit(-1);
        strcpy( *(arqvetores + i), aux);
    }
}

//free the allocated memory
void freearqvetores( char** arqvetores ){
    int i, j;
    int strtam;
    for( i = 0; i < 9; i++){
        strtam = strlen( *(arqvetores + i) );
        free(*(arqvetores + i));
    }
    free( arqvetores );
}

这里是文件“vetores”的内容:

1a 2a 3n 4n 2a 5a 6z 2z 1v 3a 11c 13e 3z 1e 14n 11n 2v 4a 3z 5a 6v 14e 2z 3a 11v
2a 2a 3z 4n 2a 5a 6z 8z 1v 3z 11c 13e 3z 2e 14n 11n 2v 4a 3z 2a 6v 14e 2z 3a 11v
3a 2a 3v 4n 2a 5a 6z 8a 1v 3a 11c 13e 3z 1e 11z 11n 2v 4a 3z 5a 6v 14e 2z 3a 11v
4a 2a 3v 4n 2a 5a 6z 8z 1v 3a 13c 13e 3z 1e 14n 11n 2v 3a 3z 5a 6v 14e 2z 7z 11v
5a 2a 4a 4n 2a 5a 6a 8z 1v 3a 11c 13e 3z 1e 14n 11n 2v 4a 3z 5a 6v 14e 2z 3a 11v
6a 2a 3z 4n 2a 5a 6z 8z 6v 3a 11c 13e 3n 1e 14n 11n 2v 5a 3z 5a 6v 14e 2z 3z 11v
7a 2a 3n 4n 2a 5a 6z 8z 1v 3a 11c 13e 3z 1e 14n 11n 2v 4a 3z 5a 6v 14e 2z 3a 11v
8a 2a 3a 4n 2a 5a 6z 8z 1v 3a 11c 13e 3z 1e 14n 11n 2v 4a 3z 5a 6v 14e 2z 3a 11v
9v 5a 6z 2n 1a 5z 6a 3z 3v 5a 13c 11a 3a 2e 13z 12e 2z 2a 3z 5a 6v 14e 2z 3z 11v
1n 4a 7v 5n 2z 4a 7z 8a 1v 8a 12z 11e 3v 1a 12z 14n 2z 2a 6v 5a 3v 14e 2z 4a 11z

【问题讨论】:

  • 你认为你有什么问题?你的代码有一些问题(幻数,在两个不同的地方设置大数组的大小,指针算术而不是索引等等),但我认为它没有理由不起作用。你有什么问题?

标签: c pointers matrix dynamic-allocation


【解决方案1】:

你需要为每一行分配一个额外的字节来保存终止的 0 字节:

    *(arqvetores + i) = (char*) malloc(strtam*sizeof(char));

应该是

    *(arqvetores + i) = (char*) malloc((strtam+1)*sizeof(char));

【讨论】:

  • 为什么我需要多分配一个字节?
  • @adriano 保存终止的 0 字节
  • @adriano:在 C 语言中,所有字符串都以包含值 0 的字节结尾——这就是您知道字符串在哪里结束的方式。
  • 我知道。我只是忘记为'\0'分配足够的内存。谢谢 j_ramdom_hacker。
  • 这种烦人的问题可以使用strdup()之类的东西一劳永逸地处理。如果您的工具链没有它(因为它不是标准的),请在此处获取您自己的一个:snipplr.com/view/16919/strdup
猜你喜欢
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2018-05-16
相关资源
最近更新 更多