调用 printf 更改地址 C 传递的数组

标签 c arrays printf

我有一段代码,它通过地址(指针)获取一个数组 这个函数简单地接受一个数组和一个整数值,即它的长度,然后一个一个地打印出数组的元素。

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/

相关文章:

c - 奇怪的 C fprintf 格式符号

c - 优化 C 中的按位运算

c - 这个数组可以用C语言实现吗?还有其他办法吗?

java - 如何将 Java varargs 与 GWT Javascript native 接口(interface)一起使用? (又名, "GWT has no printf()")

php - 在 CakePHP 中合并 2 个数组

c - 灵活数组成员(零长度数组)

c - 如何访问字符数组的第一个字符?

c - While 循环检索输入,在 C 中无法正常工作

写入 `&str_send[0] = &str_recv[c * 6];` 时,C++ 表达式不可赋值

c - 在 C 中制作没有框架的 GUI