int *ptr;
ptr=(int *)malloc(sizeof(int)*2);
ptr=100; /*What will happen if I put an asterisk(*) indicating *ptr=100? */
ptr++;
printf("ptr=%d",*ptr);
free(ptr);
因此,我希望指针增加。我为指针分配了4(2 * 2)的大小。但是我不明白指针如何仅增加2。如果在第3行中加星号,则* ptr = 100;它显示了其他东西。
最佳答案
如果您有int * ptr
,则ptr++
将指针增加单个int
的大小。如果int
在您的平台上是两个字节,这就是为什么它增加2的原因。*ptr = 100
会将100
值存储在int
所指向的ptr
处,即您与int
调用一起分配的两个malloc()
中的第一个。ptr = 100
将尝试将内存地址100
分配给ptr
,这几乎肯定不是您想要的,因为您将丢失对刚刚malloc()
所存储的内存的引用,并且内存位置100
可能对您没有意义或无法访问给你。
就目前而言,如果先执行*ptr = 100
然后再执行ptr++
,则printf()
调用将导致未定义的行为,因为您将增加指针以指向未初始化的内存(即,与int
一起分配的两个malloc()
中的第二个)呼叫),然后尝试输出其内容。
另一方面,(*ptr)++
会将100
的值增加到101
,保留ptr
的值不变,您的printf()
调用会很好,并输出101
。您分配的两个int
中的第二个仍将保持未初始化状态,但是如果您不尝试访问它,那没问题。
另外,请勿投射malloc()
的返回值,ptr=(int *)malloc(sizeof(int)*2)
应该是ptr=malloc(sizeof(int)*2)
,甚至更好的是ptr = malloc(sizeof(*ptr) * 2)
;
关于c - 动态分配和指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21782293/