gcc 4.4.4 c89
warning assignment makes integer from pointer without a cast
**devices = device_buff;
warning: value computed is not used
*devices++;
我通过以下代码获得上述警告。我想要做的是从用户那里获得一个输入。并将该char数组分配给指针数组。所以我的指针数组将包含输入的所有设备。但是,我在这条线上得到了一个UB:
**devices = device_buff;
非常感谢任何建议,
static void device_input()
{
#define DEVICE_SIZE 80
char device_buff[DEVICE_SIZE] = {0};
char **devices = NULL;
size_t i = 0;
for(i = 0; i < 3; i++) {
printf("Enter device name: ");
fgets(device_buff, (size_t)DEVICE_SIZE, stdin);
**devices = device_buff;
*devices++;
}
/* NULL terminate last element */
*devices = NULL;
printf("Display devices\n");
while(*devices != NULL) {
printf("Device [ %s ]\n", *devices++);
}
}
答案 0 :(得分:3)
**devices
是一个char,device_buff
是一个char数组。这两种类型是不兼容的。
答案 1 :(得分:3)
您正在取消引用空指针。
可以带来什么好处char** devices = NULL;
将指针初始化为NULL
。它永远不会被设置为其他任何东西,然后解除引用(两次)。
指针被认为很难,如果一个人不确切地理解他/她正在做什么,则使用它们是相当不可能的。我认为您的方案中有两个选项。您可以将名称存储在一个char
数组中,一个与另一个相邻,并保持指向这些名称开头的指针数组,或者您可以使用char
数组(二维数组)数组来将名称“单独”存储在另一个数组中。我认为第二种方式更简单,你应该从让它运作开始。
您可以像这样定义数组
#define NUM_OF_NAMES 3
char devices[NUM_OF_NAMES][DEVICE_SIZE] = {0};
现在devices[0]
,devices[1]
和devices[2]
都是char
类型的char[DEVICE_SIZE]
数组。您可以使用它们中的每一个,就像之前的缓冲区一样。< / p>
答案 2 :(得分:3)
即使您修复了编译器错误(如其他人所述),您尝试执行的操作也无法正常工作。您每次都在fgets()
调用device_array
,因此每次调用它时,它都会覆盖之前存储的内容。
可能的解决方案包括使用多个字符数组(例如char device_buff[3][DEVICE_SIZE]
)或一个长数组,并在每次调用fgets()
时推进指针。
答案 3 :(得分:1)
您必须为Buffer-ARRAY使用动态或预定义分配。 示例中的Endmarker是一个空字符串而不是NULL-Pointer。
#define DEVICE_SIZE 80
typedef char DBuff[DEVICE_SIZE];
static void device_input()
{
#define MAXB 3
DBuff device_buff[MAXB+1];
DBuff *devices=device_buff;
size_t i = 0;
for(i = 0; i < MAXB; i++,devices++) {
printf("Enter device name: ");
fgets(*devices, (size_t)DEVICE_SIZE, stdin);
}
**devices=0;
devices=device_buff;
printf("Display devices\n");
while( **devices ) {
printf("Device [ %s ]\n", *devices++);
}
}