微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么数组指针给我不同的值

如何解决为什么数组指针给我不同的值

代码成功

#include<stdio.h>

int sumOfElements_new(int *A,int size){ // int *A or int A[] same thing

    int i,sum = 0; // remember arrays decay as pointers in other functions besides main
    for (i =0; i<size;i++){
        sum += A[i]; // A[i] = *(A+i)-> value at that address
    }
    return sum;
}

int main(){

    int A[] = {1,2,3,4,5};
    int size = sizeof(A)/sizeof(A[0]);
    int total = sumOfElements_new(&A[0],size);
    printf("%d\n",&A[4]);
    printf("Sum of elements = %d\n",total);
    printf("Size of A = %d and size of A[0] = %d\n",sizeof(A),sizeof(A[0]));
    return 0;
}

现在当我做这样的事情

int total = sumOfElements_new(&A[3],size);

结果是

Sum of elements = 30
Size of A = 20 and size of A[0] = 4

每当我对&A [6]使用&A [1]时,它就会赋予我不同的值。 那为什么叫它

int size = sizeof(A)/sizeof(A[0]);

为我提供了元素总和的正确答案,但是,使用&A [1-6]答案会增加,甚至没有内存地址?

解决方法

鉴于如何定义size,(例如)int size = sizeof(A)/sizeof(A[0]);,您可以[仅]做:

sumOfElements_new(&A[0],size)

如果您使用(例如)&A[3],则无法通过:

sumOfElements_new(&A[3],size)

因为您要告诉函数求和超过数组的 end 。这是UB(未定义的行为)。该程序将获取数据的末尾内容,但该数据是随机的(只是出现 happens 的任何内容)。

您必须缩短传递给该函数的大小/长度。您想要的是:

sumOfElements_new(&A[3],size - 3)

更新:

也可能要对printf("%d\n",&A[4]);进行评论。

这提出了另一个问题。您[可能]要打印索引为A的{​​{1}}元素的 value

索引是正确的(即, not 不会超出数组的末尾),但是您正在传递该元素的 address ,而 not 其值。

使用原始代码,如果在启用警告的情况下进行编译(例如,使用4选项-IMO,您应该总是这样做),则编译器将标记此语句。 / p>

那是因为您要传递一个地址[在现代x86 cpus上可能是64位]。这是一个 unsigned 数量,您正尝试仅使用32位以十进制形式打印[因为-Wall通常只有32位]。

因此,要打印,您可能需要:

int

如果真正想打印该元素的地址 [更高级的用法],则可以执行以下操作:

printf("%d\n",A[4]);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。