gcc说“从不兼容的指针类型分配[默认启用]

时间:2014-09-09 17:21:49

标签: c pointers gcc

好的,所以我一直收到这个错误:

$ gcc -Wall -g translate.c support.c scanner.c -o translate
translate.c: In function ‘main’:
translate.c:22:16: warning: assignment from incompatible pointer type [enabled by default]
     dictionary = createArray(count);
            ^
support.c: In function ‘readTokens’:
support.c:66:18: warning: assignment from incompatible pointer type [enabled by default]
         a[count] = token;
              ^

我不知道为什么。

这是我的主要功能:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "support.h"

int main(int argc, char** argv) {
    int i;
    int count;
    char** dictionary;

    if (argc != 3) {
        printf("need two arguments!\n");
        exit(-1);
    }

    count = countTokens(argv[1]);
    printf("there are %d tokens and strings\n", count);

    dictionary = createArray(count);

    readTokens(argv[1], dictionary);

    printf("The dictionary:\n");
    for (i = 0; i < count; ++i) {
        printf("%s\n", dictionary[i]);
    }
    return 0;
}

和我的创建数组函数:

char* createArray(int count) {
    char* a;
    a = malloc(sizeof(char*) * count);
    if (a == 0) {
        fprintf(stderr, "memory allocation failed\n");
        exit(1);
    }

    return a;
}

及其标题

char * createArray(int);

我不知道如何让它消失。我试过带走并添加星号并从一个等号改为两个,但它不起作用。第二年cs学生,第一年在C.任何帮助将被赞赏一百万次。谢谢!

3 个答案:

答案 0 :(得分:6)

您的createArray函数已声明并执行时出错。你需要一个char指针数组,类型为(char **),所以创建并返回这样一个数组:

char** createArray(int count) {
    char** a;
    a = malloc(sizeof(char*) * count);
    if (a == 0) {
        fprintf(stderr, "memory allocation failed\n");
        exit(1);
    }

    return a;
}

答案 1 :(得分:5)

您的createArrray签名错误。尝试改为

char** createArray(unsigned count) {
  char** a = malloc(sizeof(char*) * count);
  if (a == NULL) {
    perror("createArray"); exit(EXIT_FAILURE);
  }
  return a;
 }

当然,相应地更改头文件中的声明:

char** createArray(unsigned);

顺便说一下,你正好用gcc -Wall -g进行编译。现在尝试在gdb调试器中逐步运行您的程序。

注意:将count声明为int是没有意义的(道德上,它不能是否定的)。

答案 2 :(得分:3)

你不算数星星。

Foo* foo =                        // 1 star
     malloc(sizeof(Foo));         // 0 stars

Foo** foo =                       // 2 stars
     malloc(sizeof(Foo*));        // 1 star

Foo******* foo =                 // N stars
     malloc(sizeof(Foo******));  // N-1 stars

如果你的计数不同,那你做错了。

当然这只是安全检查。您需要了解每个*在代码中的作用。

字典是char**。为什么?它是一个数组(第一个*)字符串(第二个*)。因此,它不能是charchar*char***。因此,在作业的右侧,您还需要char**,因此createArray必须返回char**,而a必须是char**,并且malloc里面的sizeof你需要N-1 = 1星。