嗨,我是工作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有同样的宣言,那么,为什么我得到一个错误有关不相容的类型?我的猜测是,它具有的东西与他们在被指针(因为它们是指向阵列char*,对吗?) 但我看不出为什么这就是一个问题。

当我宣布 char * car; 而不是的 char * car[MAXINT]; 它编制的罚款。但我怎么没看到那将是有用的,我稍后的时候,我需要访问某些信息使用指数,这将是非常令人讨厌的访问该信息之后。事实上,我甚至不知道如果我去约的正确方式,也许有一个更好的方式来存储一堆串而不是使用系列char*?

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

有帮助吗?

解决方案

你是创建一个新的系列大小MAXINT.我觉得你想要创建一个指向一系列大小MAXINT.

创建一个指向一系列char*'s:

以下是一系列大小MAXINT到char*要素:

char * car[MAXINT]; 

以下是指:一系列大小MAXINT到char*要素:

char* (*car)[MAXINT];

以下是如何设置一个指针:一系列大小MAXINT到char*要素:

char* (*car)[MAXINT];
car = &arg->_car;

其他的语法错误的问题:

  • 你需要有一个分号后你结构定义。
  • 你应该使用 foo*foo.因此,它应该是:
    struct foo* thing = (struct foo *) arg;
  • 你应该使用 thingarg:
    bar = thing->_bar;
    car = thing->_car;

其他提示

car _car是两个阵列,也可以用C不分配阵列(当阵列被嵌入在结构(或联合)和你的结构分配除外)。

它们也指针炭的阵列,而不是指针炭的阵列。什么你写的代码可能是你想要的东西 - 你可以指针存储多达MAXINT名在数组中。但是,应该正确地描述的类型 - 如指针char或char指针的阵列

一个指针字符数组将如下所示:

char (*car)[MAXINT];

和一个指向字符指针数组(感谢,布莱恩)将如下所示:

char *(*car)[MAXINT];

小心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
}

无论是分配到禁止也不汽车应在所有编译 - argvoid *。你可能意味着某种形式使用thing。正如布赖恩指出,存在的问题有,也:

您要么需要:

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 *”)可以防止各种滥用。

您不能分配到一个数组,你正在做的方式。你可以做一个元素的复制。

for(int i = 0; i < MAXINT; i++)
{
  car[i] = (arg->_car)[i]
}

请注意,如果如果字符串不是恒定的,则可能需要使用strcpy

C中的数组表示法是合法混淆;你的代码并不意味着你认为这意味着什么。

arg->_car手段“阵列_car的地址”。类似地,car手段“阵列car的地址”。如果你想复制_car来车的内容,那么这将做到这一点:

memcpy(car, _car, MAXINT);

但你真正的问题,我认为,是“什么是存储字符串列表的最佳方式?”这答案是:动态列表(作为一个添加的项目可以自动增长)

您会声明它是这样的:

#define CARSIZE 65
int numCars = 0;
char **car; /* a list of addresses, each one will point to a string */

要添加一个汽车:

char *newCar = malloc(CARSIZE); /* make room */
strncpy(newCar, "Mercedes", CARSIZE); /* newCar has the address of the string */
car[numCars++] = newCar; /* store it */

要列出汽车:

int n;
for (n = 0; n < numCars; ++n)
    printf("%s\n", car[n]);

要去除车内的位置n:

free(car[n]); /* release the memory */
/* condense the list of pointers */
for ( ; n < numCars - 1; ++n)
    car[n] = car[n+1];

这是在C 注意日常彻底:以上是我的头顶部,而不是从工作程序中复制,所以我不能保证所有的*是在正确的地方。我怀疑这是一个家庭作业,所以我不想给你的所有 ...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top