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
}
car和_car有相同的声明,为什么我收到有关不兼容类型的错误?我的猜测是它与指针有关(因为它们是指向char*数组的指针,对吧?)但我不明白为什么这是一个问题.
当我宣布char * car;而不是char * car[MAXINT];它编译好.但是当我需要使用索引访问某些信息时,我不知道这对我有什么用处,以后访问该信息会非常烦人.事实上,我甚至不确定我是否采用正确的方式,也许有更好的方法来存储一堆字符串而不是使用char*数组?
编辑:我不是故意使用INT_MAX(int的最大值),它只是一些其他的int,大约是20.
car并且_car都是数组,并且您不能在C中分配数组(除非数组嵌入在结构(或联合)中并且您执行结构分配).
它们也是char的指针数组,而不是指向char数组的指针.您在代码中编写的内容可能就是您想要的 - 您可以存储指向数组中MAXINT名称的指针.但是,您应该正确描述类型 - 作为char或char指针的指针数组.
指向字符数组的指针如下所示:
char (*car)[MAXINT];
并指向一系列字符指针(谢谢,Brian)看起来像:
char *(*car)[MAXINT];
注意MAXINT; 这可能是一个非常大的数组(在Linux上,<values.h>定义MAXINT为INT_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
}
对酒吧和汽车的任务都不应该编译 - 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...
}
或者你想要:
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...
}
或者,确实:
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...
}
最后,处理数组赋值,在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...
}
memcpy()如果要复制的区域重叠,则类似的函数没有可靠的语义,而是memmove(); 总是使用它更简单,memmove()因为它始终正常工作.在C++中,您需要谨慎使用memmove()(或memcpy()).在这段代码中,它足够安全,但理解为什么是非平凡的.
你需要知道你只是在这里复制指针 - 你没有复制指针指向的字符串.如果其他东西改变了这些字符串,它会影响通过car调用代码看到的值和调用代码中的变量.
最后一点 - 现在:你确定你需要函数的参数作为一个void *?它打开了各种滥用的代码,如果声明函数采用' struct foo *'代替(甚至是' const struct foo *'),可以防止这种情况.
您正在创建一个大小为 MAXINT 的新数组。我认为您想创建一个指向大小为 MAXINT 的数组的指针。
创建指向 char* 数组的指针:
以下是大小为 MAXINT 到 char* 元素的数组:
char * car[MAXINT]; 
以下是一个指向:大小为 MAXINT 的数组的指针,指向 char* 元素:
char* (*car)[MAXINT];
以下是如何将指针设置为:将大小为 MAXINT 的数组设置为 char* 元素:
char* (*car)[MAXINT];
car = &arg->_car;
问题中的其他语法错误:
foo*not foo。所以应该是:struct foo* thing = (struct foo *) arg;thingnot arg:bar = thing->_bar;car = thing->_car;