数组值发生变化
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:当可观察数组中的值发生变化时触发计算的最佳方法是啥