【发布时间】:2018-03-22 19:19:32
【问题描述】:
我想将结构传递给函数并将值存储在结构的元素中。这是我的代码。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef struct {
uint32_t len;
uint16_t *arr;
} seq;
void write_seq(seq *q, int val)
{
// How to implement this function?
uint16_t *tmp;
tmp = (uint16_t *)malloc(sizeof(uint16_t));
*tmp = val;
*(q->arr + q->len) = *tmp;
q->len += 1;
}
int main(int argc, char *argv[])
{
seq q;
q.len = 0;
q.arr = NULL;
int i;
for (i = 0; i < 10; i++) {
write_seq(&q, i);
}
printf("length is %d\n", q.len);
for (i = 0; i < q.len; i++) {
printf("%d\n", *(q.arr+i));
}
return 0;
}
我想将 0 到 9 写入 q.arr 指向的内存块。
我不想在 main() 中使用 malloc,因为在调用 write_seq 之前我不知道需要多少字节。每次调用 write_seq 时,我都想定位新内存。输出应该是这样的。
length is 10
0
1
2
3
4
5
6
7
8
9
我的 write_seq() 实现会导致核心转储。我不知道如何解决它。谢谢。
【问题讨论】:
-
与您的问题无关,但您知道对于任何指针或数组
p和索引i,表达式*(p + i)完全等于p[i]?您不必使用指针算法,并且可以省去输入几个字符。 -
另外,您有内存泄漏,您在
write_seq中分配的指针永远不会被释放。甚至没有need 来动态分配单个值。只需执行q->arr[q->len++] = val;即可完成所有功能。 -
还不明白你想要实现什么,但是为单个
uint16_t分配内存是没有意义的。 -
在另一个不相关的注释中,对于一个大小(如结构成员
len),我建议您改用size_t。虽然它可能等于uint32_t(至少在 32 位平台上),但它向代码的读者显示了意图。 -
uint32_t类型用于一般的 32 位无符号整数。它可以存储任何类型的数据,除了“32位无符号整数”之外的类型没有任何意义。类型size_t真的说“我是一个大小的类型”。所以读者会自动知道用该类型定义的变量是某种大小。
标签: c arrays pointers memory-management malloc