数组值发生变化

Posted

技术标签:

【中文标题】数组值发生变化【英文标题】:Array value getting changed 【发布时间】:2012-03-14 12:33:03 【问题描述】:

所以我有两个问题:

我正在使用 netbeans 来编写代码。

首先是我在 c.sArr 中设置的数组值从 7 变为某个随机数,我不知道为什么。

第二个是当我尝试在 netbeans 中运行调试时,代码给了我一个段错误,而当我正常运行它时却没有。它在 atoi 函数处给出了段错误。

这是怎么回事?

#include <stdio.h>
#include <stdlib.h>
#include "spoonMatrix.c"

int main(int argc, char** argv) 
    int iterations;
    int argCounter = 0;
    int debug = 1;
    int i,j,q;

    if(argc < 2)
        return -1;

    if(debug == 1)
        for(q=0;q<argc;q++)
            printf("%s\n", argv[argCounter++]);                                     //Checking the params
    

    argCounter = 1;
    iterations = atoi(argv[argCounter++]);

    if(debug == 1)
        printf("%d", iterations);

    for(i=0;i<iterations;i++)
        int rows = 0;
        int columns = 0;
        int m = 0, n, p, elemCount;
        int posCount = 0;
        int temp; 
        cm c;
        c.row = rows;
        c.column = columns;
        c.elems  = (char*)calloc(rows*columns, sizeof(char));
        c.sArr   = (int*)calloc(rows*columns, sizeof(int));

        rows = atoi(argv[argCounter++]);
        columns = atoi(argv[argCounter++]);

        for(m=0;m<rows*columns;m++)
        
            c.sArr[m] = -2;
            //printf("Here");
        

        if(debug == 1)
        
            printf("Rows : Columns - %d : %d\n", rows, columns);
        

        temp = argCounter;
        printf("argCounter is: %d\n", argCounter);
        for(elemCount = 0 ; argCounter < temp + rows; argCounter++)
        
            for(n=0; n<columns; n++, elemCount++)
            
                c.elems[elemCount] = argv[argCounter][n];
                //if(debug == 1)
                //  printf("%c\t", c.elems[elemCount]);
                if(c.elems[elemCount]== 's' || c.elems[elemCount] == 'S')
                
                    c.sArr[posCount] = elemCount;
                    printf("%c\t%d\t%d\t%d\n", c.elems[elemCount], elemCount, c.sArr[posCount++], posCount);

                
            
        

        printf("%d\n", c.sArr[0]);
        if(debug == 1)
        
            for(j=0; j<rows*columns; j++)
            
                printf("%c ", c.elems[j]);
            

            printf("\n");

            for(j=0;j<rows*columns;j++)
            
                printf("%d ", c.sArr[j]);
            
        
    

    return (EXIT_SUCCESS);

另一个文件是:

struct charMat
    int row;
    int column;
    char* elems;
    int* sArr;
;

typedef struct charMat cm;

匆忙编码,请原谅奇怪的调试语句。

谢谢

【问题讨论】:

你为什么要#include-ing .c 文件? 请原谅奇怪的调试语句 @Saphrosit 第一个 @OliCharlesworth 坏习惯。在我没有使用的其他文件中编写了更多代码。 请使代码可编译,这样其他人就不必为琐碎的事情而不是手头的实际问题而挠头 【参考方案1】:

你没有分配(足够的)内存:

int rows = 0;
int columns = 0;

c.elems = (char*)calloc(rows*columns, sizeof(char)); // rows * columns is 0
c.sArr = (int*)calloc(rows*columns, sizeof(int)); // rows * columns is 0

rows = atoi(argv[argCounter++]);
columns = atoi(argv[argCounter++]);

来自calloc:

如果请求的空间大小为 0,则行为为 实现定义:返回的值应为空 指针或唯一指针。

【讨论】:

天哪,对不起,atoi语句在分配之上。 O_O 您可能应该注意,您也不应该强制转换 calloc 的返回值。 等等,他们不是。我现在只会羞愧地淹死自己。非常感谢! @RichardJ.RossIII 为什么不呢?这是一种不好的做法吗? @Achint 是的,强制转换 malloc 或 calloc 的结果是个坏主意:***.com/questions/605845/…

以上是关于数组值发生变化的主要内容,如果未能解决你的问题,请参考以下文章

找到最小值时数组的最后一个元素发生变化

Knockout.js:当可观察数组中的值发生变化时触发计算的最佳方法是啥

滚动 UITableviewcells 时 IndexPath 值发生变化?

NumPy数组元素在选中时会发生奇怪的变化

ngOnChanges无法检测数组内容修改时解决方案

当下拉列表的值发生变化时,如何重新渲染 Flatlist?