c - 堆栈数组变量不一致 C

标签 c arrays memory stack

以下程序会产生奇怪的行为: 生成文件

all:
    gcc main.c -o main;

构建示例

./main 3 5 6 9

main.c

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main(int argc, char **argv) {
    if (argc < 1) {
            fprintf(stderr, "insertion(): requires a list of numbers\n");
            exit(1);
    } else if (argc - 1 > INT_MAX) {
            fprintf(stderr, "insertion(): requires a list of numbers less than INT_MAX\n");
            exit(1);
    }
    int ints[argc - 1];
    for (int i = 1; i < argc; i++) {
            char ci = *argv[i];
            int i = ci - '0';
            ints[i - 1] = i;
            printf("%d\n", ints[i - 1]);
    }
    for (int j = 0; j < argc - 1; j++) {
            printf("%d\n", ints[j]);
    }
    return 0;
}

产生:

3
5
6
9
random stack stuff
random stack stuff
random stack stuff
random stack stuff

这里一定有一个我缺少的概念吗? 编辑:工作解决方案感谢@tilz0R,@dbush

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main(int argc, char **argv) {
    if (argc < 1) {
            fprintf(stderr, "insertion(): requires a list of numbers\n");
            exit(1);
    } else if (argc - 1 > INT_MAX) {
            fprintf(stderr, "insertion(): requires a list of numbers less than INT_MAX\n");
            exit(1);
    }
    int ints[argc - 1];
    int k;
    for (int i = 1; i < argc; i++) {
            char ci = *argv[i];
            k = ci - '0';
            ints[i - 1] = k;
            printf("%d\n", ints[i - 1]);
    }
    for (int j = 0; j < argc - 1; j++) {
            printf("%d\n", ints[j]);
    }
    return 0;
}

最佳答案

在不同的范围内,第一个 for 中有两次 int i;

for (int i = 1; i < argc; i++) {
    char ci = *argv[i];
    int i = ci - '0'; // <--- this is problematic
    ints[i - 1] = i;  // <--- this is problematic 
    printf("%d\n", ints[i - 1]);
}

更好

for (int i = 1; i < argc; i++) {
    char ci = *argv[i];
    int tmp = ci - '0';
    ints[i - 1] = tmp;
    printf("%d\n", ints[i - 1]);
}

关于c - 堆栈数组变量不一致 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54507814/

相关文章:

c++ - 在 C++ 应用程序中使用 Tensorflow : How to release GPU memory

c - 如何从 linux 用户空间进行数据缓存刷新/失效

c++ - 数组中的第 K 个和

c++ - 如何在 C++ 中初始化 char* const argv []

c - 如何在C中为二维数组中的每个元素动态分配内存

c - C 字符串中 ptr、ptr[0] 和 &ptr[0] 的区别

linux - Linux 设备上的内存泄漏

.net - .NET CLR 上长时间运行的模拟应用程序

c - switch 语句的更好替代方案

c - 我需要将一个文件(现在是文本文件)拆分为多个缓冲区 C