【问题标题】:passing a pointer to a initialized structure in a function将指针传递给函数中的初始化结构
【发布时间】:2012-03-02 15:34:15
【问题描述】:

我的结构如下:

typedef struct{
char static_data[10];
int a;
int b;
} my_ds;

我已将其初始化如下:

my_ds * ds = (my_ds *)malloc(sizeof(my_ds));
memmove(my_ds->static_data, buf, len);
ds->a = c;
ds->b = d;

并在函数中传递它:

int my_fun(void ** data);
my_fun((void *)&ds);

my_fun 内部发生了什么,第一个字段 static[10] 已正确初始化,但其他两个值为零。我在这里错过了什么?

【问题讨论】:

  • char static[10] ?你是如何声明一个名为 static 0.o 的字段的?
  • 抱歉,已更正。
  • 请显示编译和重现问题的真实代码。
  • 真实代码太大,这里就不展示了,我会写一小段,可以编译并贴在这里,可以重现问题。
  • memmove()?你的意思是 memcpy() 或 strcpy() 甚至 strncpy() !

标签: c linux data-structures


【解决方案1】:

memmove()?我猜你打算使用 memcpy() 或 strcpy() 甚至 strncpy() !

my_fun(void **data) 中(可能)不需要双 ** 空指针可以指向任何东西,包括空指针。 (但这取决于函数定义,没有显示)

在这种情况下,my_fun ( (void**) &ds); 中的 & 符号(也不是演员表)也不需要。 any 指针可以在 C 中转换为 void 指针。

my_ds * ds;
ds = malloc(sizeof *ds);
if (len >= sizeof my_ds->static_data) len = sizeof my_ds->static_data - 1;
memcpy(my_ds->static_data, buf, len);
my_ds->static_data[len] = 0;
ds->a = c;
ds->b = d;

【讨论】:

  • memmove() 有什么问题?只有memcpy() 知道如何处理重叠缓冲区。
  • 从技术上讲,它没有任何问题。但在这种情况下,缓冲区不能重叠,因此不需要 memmove()。 len 参数仍然是错误的潜在向量,与用于复制的函数无关。
  • 1.您对 void** 的看法是正确的。我应该注意到了。我将运行您的建议并发布更新。感谢您的评论
猜你喜欢
  • 2020-04-05
  • 2020-05-15
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多