Embed攻城狮 2024-10-09 18:52 采纳率: 0%
浏览 23

C语言 int变量在执行过程中被莫名奇妙地修改

我有如下代码,在虚拟机里(ubuntu 20版本),使用gcc main.c进行编译,然后程序运行中打印的结果,len发生了修改(len 是个int变量)。同样的代码,我放到window使用eclpse(+MINGW gcc)进行编译,运行结果完成正常。 以下提问的红箭头和红框处 。

百思不得其解,求解答。

1、虚拟机ubuntu运行结果:

img

2、windows+eclipse+MinGW gcc运行结果:

img

3、程序代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void initArr(int *arr, int len) {
    for (int i = 0; i < len; i++) {
        arr[i] = rand() % 101;
    }
}

void printArr(int *arr, int len) {
    printf("len=[%d][", len);
    for (int i = 0; i < len; i++) {
        printf("%-4d", arr[i]);
    }
    printf("]\n");
}

int binarySearch(int data, int *arr, int startIndex, int endIndex) {
    while (startIndex < endIndex) {
        int mid = (startIndex + endIndex) / 2;
        if (data == arr[mid])
            return mid;

        if (data > arr[mid]) {
            startIndex = mid + 1;
            continue;
        }

        endIndex = mid - 1;
    }
    //startIndex==endIndex
    if (data >= arr[endIndex])
        return endIndex + 1;
    return endIndex;
}

void binaryInsertSort(int *arr, int len) {
    //通过二分查找,找到待插入的位置
    for (int i = 1; i < len; i++) {
        int temp = arr[i];
        printf("开始第[%d]趟排序:待插入的元素为[%d]\n", i, temp);
        int pos = binarySearch(temp, arr, 0, i - 1); //前i-1的元素是有序的
        printf("查询到的待插入的位置为[%d]\n", pos);
        //插入(1、后移; 2、插入)
        for (int j = i - 1; j >= pos; j--) {
            arr[j + 1] = arr[j];
        }
        arr[pos] = temp;
        //打印每趟排序的结果
        printf("第[%d]趟排序结果:\t", i);
        printArr(arr, len);
    }
    printf("退出排序,len=[%d]\n", len);
}

int main(void) {
    // 随机生成一个(乱序)数组
    int arr[10] = { 0 };
    //int len=sizeof(arr)/sizeof(int);
    const int len = 10;
    initArr(arr, len);

    // 打印原始的数组
    printf("ORIGINAL:len=[%d]\t", len);
    printArr(arr, len);

    // 折半插入排序
    printf("111:len=[%d]\n", len);
    binaryInsertSort(arr, len);
    printf("222:len=[%d]\n", len);

    // 打印排序后的数组
    printf("SORTED:len=[%d]\t\t", len);
    printArr(arr, len);
    return 0;
}

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-10-09 19:20
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    关于您的问题,以下是分析和可能原因的解析:

    1. 问题现象描述:在执行二进制插入排序的过程中,len变量的值在运行时被修改,导致排序结果出错。从您提供的代码和输出中,确实可以看出在执行排序的过程中len发生了变化。这可能是造成问题的原因。实际上,排序操作不应该改变数组的长度。然而,从您的代码来看,len的值并没有在排序函数中被修改。所以这个问题可能与外部因素或编译器有关。
    2. 环境差异:您提到在Ubuntu 20版本的虚拟机中使用gcc编译时出现问题,而在Windows上使用Eclipse和MinGW gcc编译时没有问题。这可能是由于环境差异导致的。可能的原因包括操作系统级别的差异、编译器版本或设置差异等。可以尝试以下方法解决:

    a. 确保使用的gcc版本相同或相似。不同版本的编译器可能会产生不同的行为。

    b. 检查虚拟机设置是否正确模拟了物理机的环境。例如,确保虚拟机具有足够的资源运行程序,并确保内存分配和磁盘访问没有问题。此外,还要检查虚拟机的CPU架构是否与物理机相同(例如都是x86架构)。如果架构不同,可能会导致一些奇怪的问题。

    c. 检查是否有其他外部因素干扰程序运行,例如操作系统中的安全软件或虚拟机中的其他设置。确保程序具有足够的权限运行,并且没有受到安全软件的干扰。此外,确保在虚拟机中关闭其他占用资源的程序或进程。

    d. 检查是否有未初始化的内存或其他内存问题导致数据被意外修改。确保在程序中正确地管理内存和变量初始化。

    无法仅凭提供的代码和输出直接定位问题原因,因此建议尝试上述方法来排查和解决该问题。同时,可以考虑提供更详细的输出日志、更多的代码细节或其他信息来进一步分析问题原因。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月9日