2014-10-18 60 views
-2

我不明白为什么if语句:& * accountslist [1] == & * unameslist [0]为true。这里发生了什么?我的realloc有问题吗?另外,当我让accountlist [1] = NULL时,似乎unameslist [0]也被设置为null。这使我认为,由于某种原因,他们最终指向同一地点。指针问题,阵列第二个位置与另一个阵列中的第一个位置相同

int loadInfo(char*** accountslist, 
      char*** unameslist, 
      char*** passlist) 
{ 
    FILE* account_file = fopen(ACCOUNTS_LOCATION, "r"); 
    FILE* uname_file = fopen(UNAMES_LOCATION, "r"); 
    FILE* pass_file = fopen(PASSWORDS_LOCATION, "r"); 

    char* nextAccount; 
    char* nextUname; 
    char* nextPass; 

    fileWithNum(account_file, &nextAccount); 
    fileWithNum(uname_file, &nextUname); 
    fileWithNum(pass_file, &nextPass); 

    *accountslist = (char**) malloc(sizeof(char*)); 
    *unameslist = (char**) malloc(sizeof(char*)); 
    *passlist = (char**) malloc(sizeof(char*)); 

    *accountslist[0] = nextAccount; 
    *unameslist[0] = nextUname; 
    *passlist[0] = nextPass; 

    int num_accounts = 1; 

    while(nextAccount != NULL && nextUname != NULL && 
      nextPass != NULL) 
    { 
     *accountslist = (char**)realloc(*accountslist, 
           (num_accounts + 1) * sizeof(char*)); 
     *unameslist = (char**)realloc(*unameslist, 
           (num_accounts + 1) * sizeof(char*)); 
     *passlist = (char**)realloc(*passlist, 
          (num_accounts + 1) * sizeof(char*)); 
     fileWithNum(account_file, &nextAccount); 
     fileWithNum(uname_file, &nextUname); 
     fileWithNum(pass_file, &nextPass); 
     printf("%s\n" , *unameslist[0]); 
     *accountslist[1] = NULL; 
     if(&*accountslist[1] == &*unameslist[0]) printf("WHY??\n"); 
     printf("%s, %s, %s\n" , *accountslist[0], *unameslist[0], *passlist[0]); 

     *accountslist[num_accounts] = nextAccount; 
     *unameslist[num_accounts] = nextUname; 
     *passlist[num_accounts] = nextPass; 

     printf("%s, %s, %s\n" , *accountslist[num_accounts], 
      *unameslist[num_accounts], *passlist[num_accounts]); 
     num_accounts++; 
    } 

    fclose(account_file); 
    fclose(uname_file); 
    fclose(pass_file); 

    return num_accounts; 
} 
+0

[不投的malloc(朋友)的结果(http://stackoverflow.com/q/605845)。 – Deduplicator 2014-10-18 23:02:08

+2

“对不起,我的代码格式不正确”......为什么不在发布之前更正它? – Deduplicator 2014-10-18 23:05:30

+0

我删除了剧组,但没有帮助。如果格式不正确,我的意思是抱歉。我不认为有问题。 – user2350896 2014-10-18 23:08:17

回答

0

&*accountslist[1]相当于accountslist[1]&*unameslist[0]相当于unameslist[0],所以你可以重写路线为:

if(accountslist[1] == unameslist[0]) printf("WHY??\n"); 

的问题是,无论是accountslistunameslist是指向你的列表,即他们是char ***类型。他们本身并不是阵列,因此unameslist[0]等于*unameslist这是您的实际unameslist阵列的地址,而accountslist[1]实际上是超出范围。既然这会让你陷入未定义的行为领域,那么你就不能指望事物的行为合理。可能发生的情况是,在调用loadInfo()之前,您宣布unameslist指向accountslist指向的那个点之前,因此accountslist[1]实际上的计算结果与*unameslist的地址相同。这个简短的程序演示了这种情况发生:

#include <stdio.h> 

void myfunc(char *** pp1, char *** pp2) 
{ 
    /* WARNING - undefined behavior ahead */ 

    printf("pp1[1] is %p, pp2[0] is %p\n", (void *) pp1[1], (void *) pp2[0]); 
} 

int main(void) 
{ 
    char ** p1 = (char **) 0xCC; 
    char ** p2 = (char **) 0xFF; 
    printf("p1 is %p, p2 is %p\n", (void *) p1, (void *) p2); 
    printf("&p1 is %p, &p2 is %p\n", (void *) &p1, (void *) &p2); 
    myfunc(&p2, &p1); 
    return 0; 
} 

其中,至少当我跑了,输出:

[email protected]:~/src/sandbox$ ./pdemo 
p1 is 0xcc, p2 is 0xff 
&p1 is 0x7fff8d138818, &p2 is 0x7fff8d138810 
pp1[1] is 0xcc, pp2[0] is 0xcc 
[email protected]:~/src/sandbox$ 

,你可以看到如何pp1[1]pp2[0]是比较平等的,由于滥用指针。如果您像以前一样将pp1[1]更改为&*pp1[1],并且同样对pp2[0]进行更改,则会看到您获得完全相同的结果,因为它们是相同的。

你真正的意思大概是这样的:

if((*accountslist)[1] == (*unameslist)[0]) printf("WHY??\n"); 

注意[]结合更加紧密比*呢,所以*accountslist[1]相当于*(accountslist[1]),当你真正想要的是尊重accountslist第一,所以你需要(*accountslist)[1]

这里的简短答案是,你有太多的间接性,你会迷惑自己,极大地滥用你的指针。因此,几乎没有任何代码正在执行您认为正在执行的操作。你应该使用一些临时变量来简化并使其对自己更容易,如:

char ** local_accounts_list = malloc(sizeof *local_accounts_list); 

,然后只在最后更新的参数有:

*accountslist = local_accounts_list; 

您也应该检查从收益malloc()和朋友,fopen(),以及其他可能会失败的功能,这是你永远不会做的。如果您不检查错误,那么当事情不起作用时您不会感到惊讶。

+0

这个问题最终导致尝试使用传入的变量而不是临时变量,然后将其分配给最后的参数。谢谢您的帮助。 – user2350896 2014-10-23 23:17:04

0

这里是fileWithNum如果有人有兴趣

int fileWithNum(FILE* fptr, char** word) 
{ 
    //finished fixing 
    int size; 
    char* temp = NULL; 
    fscanf(fptr, "%d", &size); 
    if(size == -1) 
    { 
    return 0; 
    } 
    int character = 0; 
    temp = (char*) malloc((size + 1) * sizeof(char)); 
    int current; 
    for(current = 0; current < size; current++) 
    { 
     if(fscanf(fptr, "%d", &character) != 1) 
     { 
      printf("fscanf error\n"); 
     } 
     //printf("%c\n" , character); 
     //printf("%d\n" , current); 
     temp[current] = character; 
    } 
    temp[size] = 0; //end of string char 
    *word = temp; 
    printf("End of filewithnum\n"); 
    return 0; 
} 
相关问题