2016-05-17 115 views
0

我写了这个程序:数组指针结构

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct inventory{ 
    int ID; 
    char name[20]; 
    int value; 
}; 


int main() 
{ 
    struct inventory *inv; 

    inv = malloc(sizeof(1)); 

    inv[0].ID = 10; 
    strcpy(inv[0].name,"hello charlie old mate"); 
    inv[0].value = 20; 

    inv[1].ID = 20; 

    printf("%d", inv[1].ID); 

    return 0; 
    } 

你能告诉我怎样才能inv[1].ID被设置为20.当我为inv仅配置了1个存储字节。它如何携带多个结构的数据?

+2

你有没有听说过*未定义的行为*? – haccks

+1

“当我为inv分配一个字节的内存时”是错误的。代码分配给'sizeof(1)'字节,当然不是1,但更可能是4. – chux

+1

只是为了详细说明@chux sir所说的,'sizeof'考虑的是数据类型,而不是_value_,文字'1'是类型'int'。 :) –

回答

1

你能告诉我如何将inv [1] .ID设置为20.当我为inv分配了1个字节的内存时。它如何携带多个结构的数据?

TL; DR这不可能。

你所看到的是调用undefined behavior的无效内存访问。 C标准没有任何内容阻止你编写访问无效内存的代码,但只要你这样做,瞧!

(通过调用malloc(1))分配给inv的内存是方式少那么它应该是。因此,基本上,您尝试访问不属于您的内存(您的进程),因此内存为无效。任何尝试访问无效内存都会导致UB。

按照同样的线索,您已经分配正确的内存,甚至后inv,然后还

strcpy(inv[0].name,"hello charlie old mate"); 

将UB,因为你想超过20元素复制到具有唯一的大小目的地20(如果你想name被用作字符串),它可以容纳19个有效的chars + 1空终止符。正确计算你的记忆要求,并保持在范围内。

也就是说,在使用返回的指针之前,请检查返回值malloc()是否成功。

+0

我知道你是什么意思我喊分配inv = malloc(sizeof(struct inventory)); 所以应该使指针访问只是一个结构INV [0] 但即使当我添加更多的INV [1],(...)INV [5] 它编译肯定给出了一些奇怪的答案。看看我的评论顶部与prtscr –

+3

@FenixxReborn是,或。为了更好,'inv = malloc(sizeof * inv);' –

+0

@FenixxReborn对于已编辑的部分,您__必须知道分配的大小和相应的访问权限。同样,C不会阻止你访问'inv [5]',而你只分配给1个元素,但它会导致UB。 –

3

。在你的代码未定义的行为 -

inv = malloc(sizeof(1));  // you allocate size of int 
inv[0].ID = 10; 
strcpy(inv[0].name,"hello charlie old mate"); //copying more than your buffer can hold 

您分配大小相等的int是不够的结构和访问未经授权的memory.And那么strcpy,你尝试存储超过内容可用的空间。 name最后可以包含19个字符和'\0'。并且您复制的字符串大于19个字符。