C编程语言,内存问题

时间:2012-06-09 05:50:42

标签: c

我试图读取一个文件文本(input.txt),它包含多行,如A B 120 C B 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 个答案:

答案 0 :(得分: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[]

中存储的元素数量

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

它将“malloc()”和“strcpy()”组合成一个操作 - 让您免于担心自己是否“正确地”使用了“正确的大小”。

答案 3 :(得分:1)

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

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

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