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/

10-12 03:07