如何解决为什么数组指针给我不同的值
代码成功
#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 举报,一经查实,本站将立刻删除。