我正在创建一个修改动态数组的程序。它必须初始化数组并能够插入其中。为了测试它,我以后无法打印数组,我该怎么做呢?
一段相关代码:
typedef struct {
char first;
char second;
} name;
typedef struct {
int number;
name name;
} data;
/*points to array, number allocated, number used*/
typedef struct {
data *info;
size_t numof;
size_t numused;
} list;
void init(list *l) {
l->data = malloc(sizeof(l) * l->numof);
l->numused = 0;
l->numof = 2;
}
int insert(list *l, const data *dat) {
if (l->numused == l->numof) {
l->numof *= 2;
l->data = (int *)realloc(l->data, l->numof * sizeof(int));
}
l->data[l->numused++] = *dat;
return 0;
}
int main(void) {
int i;
list l;
data list1;
/*example info for testing*/
list.number = 1234;
strcpy(list1.name.first, "abc");
strcpy(list1.name.second, "xyz");
init(&l);
insert(&l, list1);
/*runs through array elements to print*/
for (i=0; i < ((int)sizeof(&l)) /(int)sizeof(&l); i++) {
printf("%s\n", list1);
}
return 0;
}
编辑:我只需要知道如何打印数组以查看我是否正确执行,上面的代码会出错,因为我一直在努力解决这个问题。
答案 0 :(得分:1)
strcpy(list1.name.first, "abc");
strcpy(list1.name.second, "xyz");
这两个都将调用未定义的行为,因为first
和second
被声明为char
变量,并且您将字符串文字复制到它们。
您需要将它们都声明为字符数组。
而这 -
for (i=0; i < ((int)sizeof(&l)) /(int)sizeof(&l); i++) {
printf("%s\n", list1);
}
您尝试使用list1
说明符打印结构变量%s
,也许您倾向于打印要复制的字符串。因此,使用list1.name.first
说明符直接在list1.name.second
中打印printf
和%s
。
条件 -
i < ((int)sizeof(&l)) /(int)sizeof(&l)
不需要强制转换,它会产生1
因此,循环将运行1
时间。改变条件。
答案 1 :(得分:0)
在您的代码中,结构name
的成员定义为char
。但是您正在尝试将字符串复制到其中。可能这是一个错字。如果不是,则应将它们定义为字符数组或字符指针。同样在print语句中,您尝试将结构data
打印为字符串。它应该像 -
printf("%s %s\n", list1.name.first, list1.name.second);
您还为list.number
指定了值1234。你的意思可能是list1.number
。 insert
函数调用中的参数也是错误的。最后,您已将l->data
放入函数init
和insert
,这些函数应为l->info
。