c分配不兼容的类型,指针问题?

Fan*_*ier 6 c struct pointers void

嗨,我正在使用C,我有一个关于分配指针的问题.

struct foo
{
   int _bar;
   char * _car[SOME_NUMBER]; // this is meant to be an array of char * so that it can hold pointers to names of cars
}

int foofunc (void * arg)
{
   int bar;
   char * car[SOME_NUMBER];

   struct foo * thing = (struct foo *) arg;

   bar = thing->_bar; // this works fine
   car = thing->_car; // this gives compiler errors of incompatible types in assignment
}
Run Code Online (Sandbox Code Playgroud)

car和_car有相同的声明,为什么我收到有关不兼容类型的错误?我的猜测是它与指针有关(因为它们是指向char*数组的指针,对吧?)但我不明白为什么这是一个问题.

当我宣布char * car;而不是char * car[MAXINT];它编译好.但是当我需要使用索引访问某些信息时,我不知道这对我有什么用处,以后访问该信息会非常烦人.事实上,我甚至不确定我是否采用正确的方式,也许有更好的方法来存储一堆字符串而不是使用char*数组?

编辑:我不是故意使用INT_MAX(int的最大值),它只是一些其他的int,大约是20.

Jon*_*ler 5

car并且_car都是数组,并且您不能在C中分配数组(除非数组嵌入在结构(或联合)中并且您执行结构分配).

它们也是char的指针数组,而不是指向char数组的指针.您在代码中编写的内容可能就是您想要的 - 您可以存储指向数组中MAXINT名称的指针.但是,您应该正确描述类型 - 作为char或char指针的指针数组.

指向字符数组的指针如下所示:

char (*car)[MAXINT];
Run Code Online (Sandbox Code Playgroud)

并指向一系列字符指针(谢谢,Brian)看起来像:

char *(*car)[MAXINT];
Run Code Online (Sandbox Code Playgroud)

注意MAXINT; 这可能是一个非常大的数组(在Linux上,<values.h>定义MAXINTINT_MAX,至少是2 31 -1).


代码如下:

struct foo
{
   int _bar;
   char * _car[MAXINT];
}

int foofunc (void * arg)
{
   int bar;
   char * car[MAXINT];
   struct foo thing = (struct foo *) arg;
   bar = arg->_bar; // this works fine
   car = arg->_car; // this gives compiler errors of incompatible types in assignment
}
Run Code Online (Sandbox Code Playgroud)

对酒吧和汽车的任务都不应该编译 - arg是一个void *.你可能想要以thing某种形状或形式使用.正如Brian所说,那里也存在问题:

你要么:

int foofunc(void *arg)
{
    int bar;
    char *car[MAXINT];
    struct foo thing = *(struct foo *)arg;
    bar = thing._bar; // this works fine
    car = thing._car; // this is still an array assignment
    ...other code using bar and car...
}
Run Code Online (Sandbox Code Playgroud)

或者你想要:

int foofunc(void *arg)
{
    int bar;
    char *car[MAXINT];
    struct foo *thing = (struct foo *) arg;
    bar = thing->_bar; // this works fine
    car = thing->_car; // this is still an array assignment
    ...other code using bar and car...
}
Run Code Online (Sandbox Code Playgroud)

或者,确实:

int foofunc(void *arg)
{
    struct foo *thing = (struct foo *) arg;
    int bar           = thing->_bar; // this works fine
    char *car[MAXINT] = thing->_car; // this is still an array assignment
    ...other code using bar and car...
}
Run Code Online (Sandbox Code Playgroud)

最后,处理数组赋值,在C中你可以合理地memmove()用来做到这一点:

int foofunc(void *arg)
{
    struct foo *thing = (struct foo *) arg;
    int bar           = thing->_bar; // this works fine
    char *car[MAXINT];
    memmove(car, thing->_car, sizeof(car));
    ...other code using bar and car...
}
Run Code Online (Sandbox Code Playgroud)

memcpy()如果要复制的区域重叠,则类似的函数没有可靠的语义,而是memmove(); 总是使用它更简单,memmove()因为它始终正常工作.在C++中,您需要谨慎使用memmove()(或memcpy()).在这段代码中,它足够安全,但理解为什么是非平凡的.

你需要知道你只是在这里复制指针 - 你没有复制指针指向的字符串.如果其他东西改变了这些字符串,它会影响通过car调用代码看到的值和调用代码中的变量.

最后一点 - 现在:你确定你需要函数的参数作为一个void *?它打开了各种滥用的代码,如果声明函数采用' struct foo *'代替(甚至是' const struct foo *'),可以防止这种情况.


Bri*_*ndy 3

您正在创建一个大小为 MAXINT 的新数组。我认为您想创建一个指向大小为 MAXINT 的数组的指针。

创建指向 char* 数组的指针:

以下是大小为 MAXINT 到 char* 元素的数组:

char * car[MAXINT]; 
Run Code Online (Sandbox Code Playgroud)

以下是一个指向:大小为 MAXINT 的数组的指针,指向 char* 元素:

char* (*car)[MAXINT];
Run Code Online (Sandbox Code Playgroud)

以下是如何将指针设置为:将大小为 MAXINT 的数组设置为 char* 元素:

char* (*car)[MAXINT];
car = &arg->_car;
Run Code Online (Sandbox Code Playgroud)

问题中的其他语法错误:

  • 您需要在结构定义后有一个分号。
  • 你应该使用foo*not foo。所以应该是:
    struct foo* thing = (struct foo *) arg;
  • 你应该使用thingnot arg
    bar = thing->_bar;
    car = thing->_car;