【发布时间】:2017-09-22 04:34:14
【问题描述】:
我有一段代码,它通过地址(指针)获取一个数组 这个函数简单地接受一个数组和一个整数值,它是它的长度,并一个一个地打印出数组的元素。
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 时,效果很好。从我的终端查看这个 sn-p:
-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。
这到底是怎么回事?!
这没有任何意义。我在内存中传递数组的地址,所以我不希望堆栈与此有任何关系?
【问题讨论】:
-
我在内存中传递数组的地址,所以我不希望堆栈与此有任何关系? - 如果实际元素在堆栈,那么当然堆栈可能与它有关。当然,现在还不能说。 minimal reproducible example 是关键。还可以尝试使用 -Wall -Wextra 进行编译,并可能使用诸如 clang-tidy 或 cppcheck 之类的东西来轻松开始。
-
我的水晶球说错误出在您未显示的代码中。在调用该函数之前,您可能已经完全损坏了内存,但我们无法判断。
-
不能确定它是否解决任何问题,但
malloc需要字节,而不是对象计数。 -
您正在使用 malloc 分配内存。您询问您需要的元素数量,而您应该询问您需要的字节数。因此,您应该请求
malloc((size_t)bufsiz * sizeof(*array) )字节而不是malloc((size_t)bufsiz)(sizeof(*array) 与 sizeof(int) 相同 - 它是数据类型。)通过请求第一个元素的大小,我们在维护时避免了问题通过使用不同的数据类型并忘记在我们的 malloc 调用中修改元素大小来编写以后的代码。 @chris 似乎已经提到了这个问题。 ;) -
您分配的内存太少。 Printf 也分配内存。 Printf 覆盖它分配的内存,因为它是正确的。在另一台机器上,它的行为不同,因为 printf 和/或 malloc 的实现方式不同。