2

我正在尝试读取由多行组成的文件文本(input.txt),例如 AB 120 CB 60 ...
好吧,现在我正在尝试将可能在该文件中重复多次的名称传输到一个双指针,它们应该只显示一次。在下面的代码中,我得到了其中的一些,但我也遇到了分段错误。我不知道我错过了什么或出了什么问题。你的任何一点帮助都会对我有很大帮助。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]){
   int i=1, state=0, k, dist;
int** myMat;
char *city1, *city2, **matnames;
FILE* p;
    city1 = (char*) malloc(sizeof(char));
    city2 = (char*) malloc(sizeof(char));
    matnames = (char**) malloc(sizeof(char*));
    myMat = (int**) malloc(sizeof(int*));               
p = fopen(argv[1],"r");
/************************************************************/
    matnames[0] = (char*) malloc(sizeof(char));
    matnames[1] = (char*) malloc(sizeof(char));
    matnames[2] = (char*) malloc(sizeof(char));
    matnames[2] = NULL;
    fscanf(p, "%s %s %d", city1, city2, &dist);
        strcpy(matnames[0],city1);
        strcpy(matnames[1],city2);
/************************************************************/  
while( fscanf(p,"%s %s %d",city1,city2, &dist) != EOF){             
        for(k=0; matnames[k]!=NULL; k++){                   
            if( strcmp(matnames[k], city1) != 0){
                 state++;
                }               
        }       
        if(state  == k){
            matnames[k] = (char*) malloc(sizeof(char));
            strcpy(matnames[k], city1);
            matnames[k+1] = (char*) malloc(sizeof(char));
            matnames[k+1] = NULL;
            }
        state = 0;
        for(k=0; matnames[k] != NULL;k++){                  
                if( strcmp(matnames[k], city2) != 0){
                    state++;
                }               
        }
        if(state == k){
            matnames[k] = (char*) malloc(sizeof(char));
            matnames[k+1] = (char*) malloc(sizeof(char));
            strcpy(matnames[k], city2); 
            matnames[k+1] = NULL;   
            }
        state = 0;

}
return 0;
}
4

4 回答 4

3
matnames = (char**) malloc(sizeof(char*));

您在这里只为一个分配了足够的内存char*

然后你打电话

matnames[1] = (char*) malloc(sizeof(char));

而 matnames 只有一个空间char*matnames[1]试图访问空间一秒钟char *

你需要做的是

matnames = (char**) malloc(n * sizeof(char*));

n您希望存储的元素数量在哪里matnames[]

于 2012-06-09T05:55:54.683 回答
1

除其他事项外,您已经分配了足够的内存matnames来存储one char *,但您在其中存储了三个值。它也没有帮助你 malloc 一些内存matnames[2],然后立即用它覆盖 malloc 的指针NULL——但这只是内存泄漏,因为你实际上并没有尝试将任何内容存储到*(matnames[2]). 可能还有其他问题,但让我们从最直接的问题开始。

于 2012-06-09T05:56:46.983 回答
1

您可能还对“strdup()”感兴趣:

它将“malloc()”和“strcpy()”组合到一个操作中 - 并且让您不必担心您是否“malloc'ed”了正确的大小。

于 2012-06-09T05:57:54.110 回答
1

在 C 中,表达式sizeof(char)将始终返回1。这是根据定义:sizeof()可以在许多不同类型的计算机上工作,而不是每个都使用字节。

因此,您只为每个名称分配一个字节。如果城市名称可以有 20 个字符长,请使用malloc(21)(不要忘记'\0'在字符串中也有空格)。

对于(char **)指针,您应该计算出需要存储多少个指针,然后乘以sizeof(char *). 因此,如果您需要存储 3 个char *指针,请使用malloc(3 * sizeof(char *)).

于 2012-06-09T05:58:41.743 回答