我有一段代码,它通过地址(指针)获取一个数组 这个函数简单地接受一个数组和一个整数值,即它的长度,然后一个一个地打印出数组的元素。
void dumpInts(int *array, int count, int hex){
int i;
for(i = 0; i < count; i++){
printf(" %*d",10,array[i]);
}
上面的代码已经高度简化,下面是剩下的代码。它没有那么大。
#include <stdio.h>
#include <stdlib.h>
int LAST = -1059786739;
int FIRST = -559038737;
//Input is a series of integers read in from stdin separated by whitespace
void dumpInts(int *array, int count, int hex);
void initArray(int *array, int size);
int main(){
int bufsiz ;
if(scanf("%d",&bufsiz) < 1){
fprintf(stderr,"CAN\'T READ BUFSIZ\n");
return 1;
}
if(bufsiz < 1){
fprintf(stderr,"BAD BUFSIZ=%d\n",bufsiz);
return 1;
}
bufsiz+=2;
int *array = (int *)malloc((size_t)bufsiz);
if(array == NULL){
fprintf(stderr,"NO MORE MEM\n");
return 1;
}
array[0] = FIRST;
array[bufsiz-1] = LAST;
initArray(array,bufsiz);
dumpInts(array,bufsiz,0);
dumpInts(array,bufsiz,1);
return 0;
}
void initArray(int *array, int size){
int i;
for(i = 1; i < size - 1; i++){
array[i] = i;
}
}
void dumpInts(int *array, int count, int hex){
int i;
for(i = 0; i < count; i++){
printf(" %*d",10,array[i]);
}
事情是这样的。当数组的大小小于 7 时,效果很好。从我的终端查看这个片段:
-559038737 1 2 3 4 -1059786739
但突然间,当大小超过 7 时,最后一个元素被覆盖,所有后续内存都设置为随机值,但第 7 个元素始终设置为相同的值... 1041
下面是一个大小为8的数组
-559038737 1 2 3 4 5 1041 0 892677408 942878777
现在,在我继续之前,我觉得我应该努力,我确实花时间仔细缩小了数组被破坏的确切位置。在它进入函数之前,它是我期望的样子,一旦第一个循环打印出来,数组就被破坏了。
好吧,这就是它变得奇怪的地方。我通过 SSH 进入我大学的 linux 机器,并运行我的代码。没有破坏,数组很好。
下面是尺寸 7 的比较
我的:
-559038737 1 2 3 4 5 1041
大学:
-559038737 1 2 3 4 5 -1059786739
我要重启我的机器....
*刚刚重新启动,同样的问题仍然存在......同样的号码......同样的大小......
此外,当我在大学计算机上编译代码并将其复制到我的机器上时,数组仍然被破坏。当我在我的机器上编译它时不是这样。
我的机器和大学的机器都是基于unix的系统,运行linux。
这到底是怎么回事?!
这没有任何意义。我在内存中传递数组的地址,所以我不希望堆栈与此有任何关系?
最佳答案
你的问题中隐含的诊断Calling printf changes array passed by address 是不正确的:你没有按地址传递数组,而只是按值传递数组元素和printf
不改变数组。您观察到的是未定义行为的影响。
元素数量和分配数组的大小之间存在一些混淆:您可以使用更有意义的名称来表示数组元素的数量 (count
) 而不是大小数组的字节数,传递给 malloc()
。
按照编码,您没有为数组分配足够的内存,初始化此数组的代码和打印它的代码都具有未定义的行为,因为您访问数组超出了其边界。
此外,您不使用 hex
参数在十进制和十六进制输出之间进行选择。
这是更正后的版本:
#include <stdio.h>
#include <stdlib.h>
int LAST = -1059786739;
int FIRST = -559038737;
//Input is a series of integers read in from stdin separated by whitespace
void dumpInts(const int *array, int count, int hex);
void initArray(int *array, int size, int start);
int main(void) {
int count;
if (scanf("%d", &count) != 1) {
fprintf(stderr,"Cannot read the number of elements\n");
return 1;
}
if (count < 1) {
fprintf(stderr,"Invalid count=%d\n", count);
return 1;
}
count += 2;
int *array = malloc(sizeof(*array), count);
if (array == NULL) {
fprintf(stderr,"Out of memory\n");
return 1;
}
array[0] = FIRST;
initArray(array + 1, count - 2, 1);
array[count - 1] = LAST;
dumpInts(array, count, 0);
dumpInts(array, count, 1);
return 0;
}
void initArray(int *array, int count, int start) {
for (int i = 0; i < count; i++) {
array[i] = start + i;
}
}
void dumpInts(count int *array, int count, int hex) {
for (int i = 0; i < count; i++) {
if (hex) {
printf(" %10x", array[i]);
} else {
printf(" %10d", array[i]);
}
}
}
关于调用 printf 更改地址 C 传递的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46356928/