【问题标题】:creating memory of the size of a pointer for char array inside struct在struct中为char数组创建指针大小的内存
【发布时间】:2013-09-14 04:41:49
【问题描述】:

我有一个程序要求使用argv 输入两个参数,然后我想使用argv[1]argv[2] 的长度为我的struct 中的两个指向char 的指针动态分配内存等于大小为argv[1]argv[2]

这是我的代码,但我不确定我是否正确,有人可以验证吗?函数内部的参数passedargv1passedargv2是从main()函数传递过来的argv[1]argv[2]。基本上我想让chararray1=argv[1]chararray2=argv[2] 就像它们只是普通的char 数组一样,但我不提前知道我们输入的大小,所以我不能预先初始化chararray2 和@ 987654338@。另外,我无法更改 argv 内部的内容,因此我不能让 chararray1chararray2 指向它们,因为我稍后需要更改它们。

struct StructInformation{

    char *chararray1;
    char *chararray2;
};



typedef struct StructInformation SimplifiedStruct;

SimplifiedStruct *CreateMem(char *passedargv1, char *passedargv2) {

SimplifiedStruct *ptr=(SimplifiedStruct*)malloc(sizeof(SimplifiedStruct));
ptr->chararray1=(char*)malloc(sizeof(passedargv1));
ptr->chararray2=(char*)malloc(sizeof(passedargv2));

【问题讨论】:

  • 如果您使用的是符合 POSIX 或 XOPEN 标准且具有 strdup() 的系统,这会变得非常简单并且停止投射 malloc() 结果
  • 哦,我的错,我会解决的,谢谢。但是 sizeof(passedargv1) 是这样吗?还是我需要将其设为 &passedargv1 因为它是一个指针?
  • 那行不通。 sizeof(passedargv1) 应该是 4 或 8 字节(假设是 32 或 64 位系统)。即使取消引用它,它也不起作用,因为 sizeof() 参数是在编译时计算的。正如@WhozCraig 建议的那样, strdup() 可能是你最好的选择。

标签: c pointers memory memory-management


【解决方案1】:
  1. 不要从malloc()投回回报

  2. malloc(char*)malloc 显然是错误的。

  3. 对于您的主要问题,sizeof(passedargv1)sizeof(passedargv2) 都只是评估为 sizeof(char *),所以不,您没有正确完成。您需要在两个参数上调用 strlen(),并在每个参数上添加 1,这将告诉您需要分配多少内存,假设您只想复制字符串。

例如:

ptr->chararray1 = malloc(strlen(passedargv1) + 1);
ptr->chararray2 = malloc(strlen(passedargv2) + 1);

然后大概:

strcpy(ptr->chararray1, passedargv1);
strcpy(ptr->chararray2, passedargv2);

别忘了查看malloc() 的返回信息,以确保您有记忆。

【讨论】:

  • 对于 1. 你的意思是 (SimplifiedStruct*) 和 (char*)?我认为这是类型安全问题所必需的,因为创建内存不知道要返回什么类型。 2. 解决了,谢谢。 3. 所以你的意思是我应该做类似 sizeof(strlen(passedargv1)+1) 的事情?
  • @user2778481: 1 - 是的,这就是我的意思。你被误导了。它在 C++ 中是必需的,并且在很多年前在 C 中也是必需的,但对于现代 C 来说,这很糟糕,并且会损害类型安全而不是帮助它。 3. 不完全,见编辑。
  • 啊,我明白了,1 个字符是 1 个字节,所以它提供了正确的内存空间。谢谢。
  • @user2778481:正确,sizeof(char) 定义为 1
  • 如果我释放结构体,从结构体内部的两个 char 指针分配的内存也会被释放,还是必须单独释放?
【解决方案2】:

sizeof 替换为strlen 并记住包括string.h。因为指针的大小总是等于 4。而且调用 malloc 时不需要使用cast

ptr->chararray1 = malloc(strlen(passedargv1) + 1);
ptr->chararray2 = malloc(strlen(passedargv2) + 1);

编辑:
malloc原型:
void* malloc (size_t size); 它返回一个void* 的指针,可以将其转换为所需类型的数据指针,以便可取消引用。由于您已经将chararray1chararray2 定义为char*,因此可以省略强制转换。

【讨论】:

  • 终止'\0'需要加1。
  • 指针的大小并不总是 4。在 64 位机器上它是 8,甚至可能还有其他具有不同指针大小的奇异机器。
  • 如果你想在没有正确类型的指针变量的帮助下取消引用它们或访问它们的成员,你实际上确实需要转换 void 指针,我认为这就是他的意思。例如,在 char * my_func(void * ptr) { return ((struct StructInformation *) ptr)->chararray1; } 中强制转换是必需的,尽管在这个特定示例中首先使用 void 指针会非常愚蠢。
猜你喜欢
  • 1970-01-01
  • 2021-12-14
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多