数组的指针算术

时间:2018-11-07 16:51:46

标签: c pointers math

我试图用C编写一个简单的程序,将元素存储在指针中。打印数组的元素时,我得到的是垃圾值。

代码如下:

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

#define MAX 5

int main(int argc, char const *argv[]) {

    int* a = (int*)malloc(MAX * sizeof(int));
    int* b = NULL;
    int* const maxAddress = a + MAX;

    if(a != NULL) {
        for(int index = 0; b = a, b < maxAddress; index++) {
            *(a + index) = index;
            printf("Value: %d, Index: %d\n", *(a + index), index);
            a++;
        } 
    }   

    printf("\n\n");

    for(int index = 0; index < MAX; index++) // Getting junk values here
        printf("Index: %d, Value: %d, Address: %p\n", index, *(a + index), a + index);

    return 0;
}

3 个答案:

答案 0 :(得分:0)

您有两个独立的增量。在for循环中,您执行index++,而在循环结束时,您执行a++。这意味着您的第一个写入对象是a[0],下一个是写入a[1 + 1],依此类推。基本上,您将跳过所有其他元素。

为避免执行此增量aindex,但不能同时进行。由于您希望index的值增加,因此建议删除行a++

变量b仅在循环开始时才使用,因此条件b = a, b < maxAddress似乎毫无意义。它可以写为a < maxAddress。如果我有这样的猜测,则在完整版本的代码中使用b来保留a的先前值用于下一次迭代。

答案 1 :(得分:0)

这是更正的代码: b应该在循环之前初始化。 for循环不正确 您应该在循环中增加b而不是a

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

#define MAX 5

int main(int argc, char const *argv[]) {

    int* a = (int*)malloc(MAX * sizeof(int));
    int* b = a;
    int* const maxAddress = a + MAX;

    if (a != NULL) {
        for (int index = 0; b < maxAddress; index++) {
            *(a + index) = index;
            printf("Value: %d, Index: %d\n", *(a + index), index);
            b++;
        }
    }

    printf("\n\n");

    for (int index = 0; index < MAX; index++) // Getting junk values here
        printf("Index: %d, Value: %d, Address: %p\n", index, *(a + index), a + index * sizeof(int));

    return 0;
}

答案 2 :(得分:0)

语法a[index]等效于index++;后者会更清楚地表明您对代码的意图。

如果我们通过循环主体中的for行(在a++循环声明中)和a行对您的操作进行分解,您会发现自己重新访问您实际上没有为*(a + index) accesses a[0] a[0] a[1] a[2] a[3] a[4] 0 ? ? ? ? 分配的内存:

循环迭代#0(a =分配的地址索引= 0):

*(a + index) accesses a[2]
a[0]   a[1]   a[2]    a[3]    a[4]
 0      ?      1       ?       ?

循环迭代#1(a =分配+1索引= 1):

*(a + index) accesses a[6]
a[0]   a[1]   a[2]    a[3]    a[4]     | MEMORY NOT BELONGING TO a
 0      ?      1       ?       ?                   3?

在第3次迭代时,您开始写遍数组:

for

此外,在您的初始a循环之后,您将指针malloc递增到分配的数量的末尾,您尝试再次访问它而不将其重置为初始值,因此,访问权限甚至都不是您(您曾经认为的)分配的权限。

这对于使用free分配的内存尤其不利,因为通常以后使用a,但是如果没有指向已分配内存块开始的指针,则无法做到这一点。

解决方案:

请勿在初始for循环中增加for(int index = 0; (a + index) < maxAddress; index++) // Also valid: ...; index < MAX; ... { *(a + index) = index; printf("Value: %d, Index: %d\n", *(a + index), index); } ,并使用正确的真实条件:

export class DashboardComponent implements OnInit {
    dwsubscriptions: Observable<Dwsubscription>[] = new Array();

    ngOnInit() {
        this.dwsubscriptions.push(
            this.devicewiseService.getSubscription('Randomizer', '1', 3, 1, -1)
        )
    }
}