我正在尝试设置以下结构的参数:
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*
时不兼容的类型。
我该如何解决?
答案 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];
完成后 - 您必须使用strcpy
将name
的内容复制到指定的数组。数组是不可修改的左值 - 为某些东西分配 - 它是错误的。
因此,在确保目标有足够的存储空间来存储要复制的字符串后,写入
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);
}