从类型'char *'分配类型char [32]时不兼容的类型

时间:2018-02-14 18:51:03

标签: c

我正在尝试设置以下结构的参数:

typedef struct thread_args_s {
    int idx;
    int role;
    int fifo_desc;
    char client_fifo_name[FIFO_NAME_MAX_LENGTH];
    char msg[MSG_MAX_LENGTH];
} thread_args_t;

我在分配thread_args_t->client_fifo_name时遇到了问题。

client_fifo_name由字符串CLIENT_FIFO_NAME_SUFFIX + i连接,使用sprintf()

详细说明:

int i;
char* name;

for(i=0; i<THREAD_COUNT-1; i++){
    thread_args_t* prod_args = malloc(sizeof(thread_args_t));
    prod_args->idx = i;
    prod_args->role = PROD_ROLE;
    prod_args-> fifo_desc = server_fifo;
    sprintf(name, "%s%d", CLIENT_FIFO_NAME_SUFFIX, i);
    //How to assign the string "name" to prod_args->client_fifo_name?
    prod_args->client_fifo_name = name;
    [...]}

编译,错误是:

  

从类型char[32]分配到类型char*时不兼容的类型。

我该如何解决?

3 个答案:

答案 0 :(得分:2)

类型是不兼容的,因为赋值的左手正好是32个字符,但赋值的右手是指针。我猜,但你可能想要:

snprintf(prod_args->client_fifo_name,
         FIFO_NAME_MAX_LENGTH,
         "%s%d",
         CLIENT_FIFO_NAME_SUFFIX, i);

答案 1 :(得分:1)

使用name的正确方法是(此处您尚未分配char*变量指向的任何内存)

  • char *name = malloc(MAXLEN+1);检查malloc
  • 的返回值

或使用数组

  • char name[MAXLEN+1];

完成后 - 您必须使用strcpyname的内容复制到指定的数组。数组是不可修改的左值 - 为某些东西分配 - 它是错误的。

因此,在确保目标有足够的存储空间来存储要复制的字符串后,写入

strcpy(prod_args->client_fifo_name , name);

要解释错误 - 此处它会在行prod_args->client_fifo_name = name;中找到类型不匹配,此处左侧的分配类型为char [],右侧为char *。分配中这些类型的不匹配会导致错误。

此外,我刚刚纠正了可能的错误 - 您可以在复制到实际内存之前省略分配额外内存。您可以直接使用s(*)printf将最终目标变量作为缓冲区。

答案 2 :(得分:0)

  

从'char *'类型分配到char [32]类型时不兼容的类型   我在分配thread_args_t-&gt; client_fifo_name。

时遇到了问题

作为数组中的prod_args->client_fifo_name,无法在C中指定

要分配一个chracter数组的元素,代码可以使用sprintf(), snprintf(), memcpy(), strcpy()或类似代码复制@Whilom Chime所回答的数据。

代码也可以一次分配一个数组的每个元素(一个char),但让我们避免这种情况。

snprintf()是一个不错的选择,但健壮的商品还会检查数据是否合适。

// sprintf(name, "%s%d", CLIENT_FIFO_NAME_SUFFIX, i);
// prod_args->client_fifo_name = name;
int count = snprintf(prod_args->client_fifo_name, sizeof prod_args->client_fifo_name,  
    "%s%d", CLIENT_FIFO_NAME_SUFFIX, i);

// Check for success
if (count < 0 || count >= sizeof prod_args->client_fifo_name) {
  fprintf(stderr, "Not enough room or other error.  Good-bye\n");
  exit(EXIT_FAILURE);
}