为什么C程序2D阵列第二行替换第一行

时间:2013-04-25 18:38:46

标签: c arrays multidimensional-array

我首先将buf传递给数组是schArray [i] [0] = buf;

例如我需要buf进入schArray

ABCDEFG to [0][0] 

1234567 to [1][0]

但是我无法做到这个结果

我的结果第二行替换第一行

Time 1:  [0][0]  = ABCDEFG
         [1][0]  = null

Time 2 :[0][0]  = 1234567
        [1][0]  = 1234567

替换[0] [0]

char ***schArray;

int q,k;

schArray = (char***)malloc(sizeof(char*)*1000);
for(q = 0; q < 1000; q++){

    schArray[q] = (char**)malloc(sizeof(char)*100);

    for(k = 0; k < 1000; k++){
        schArray[q][k] = (char*)malloc(sizeof(char)*100);
    }
}

while(strncmp(buf, KEYWORD_endP,KEYWORD_PS_SZ)!=0){
  schArray[commandnum][0] = buf;

  printf("%s\n",schArray[0][0]);
  printf("%s\n",schArray[1][0]);
  printf("%s\n",schArray[2][0]);

  val=printCommand(buf);

  printf("child: %d\n",val);

  // printf("child:%d",val);

  memset(buf, 0, 80);

  write(cTop[i][1],&buf,80*sizeof(char));
  read(pToc[i][0],&buf,80*sizeof(char));
  commandnum++;
}

预期产出

ABCDEFG 

1234567 

实际输出

1234567

1234567

2 个答案:

答案 0 :(得分:1)

主要问题是这一行:

schArray[commandnum][0] = buf;

这不会复制buf,它会将数组元素设置为指向buf的位置。所以每次你指向同一个缓冲区。

您需要使用strcpy()将缓冲区复制到数组元素中:

strcpy(schArray[commandnum][0], buf);

另一个问题是您的循环调用malloc()sizeof参数不正确。

schArray = malloc(sizeof(char**)*1000);
for(q = 0; q < 1000; q++){
    schArray[q] = malloc(sizeof(char*)*100);
    for(k = 0; k < 1000; k++){
        schArray[q][k] = malloc(sizeof(char)*100);
    }
}

您也不需要投射malloc()的结果。它返回void*,这将根据需要自动转换(在C中,但不是C ++)。包括显式强制转换可以掩盖其他错误,例如忘记声明#included的{​​{1}}。

答案 1 :(得分:1)

请不要将大量指针数组分配给指向字符的指针。初学C程序员通常最初习惯使用数组。然后他们想要进入更复杂的东西并开始使用2d数组。然后他们意识到他们必须将他们的东西移到堆中,然后他们似乎无法放弃C阵列方案,只是转向更有用的东西。

具体来说,您不需要使用C数组语法访问元素,例如myarray[3][4]来访问x = 3,y = 4的元素。现在是时候开始自己做数学并为自己(和其他人)节省大量头痛。

#define MY_ARRAY_HEIGHT 1000
#define MY_ARRAY_WIDTH 1000

static inline char getElement(char *myArray, unsigned x, unsigned y) {
    return myArray[x + y * MY_ARRAY_WIDTH];
}

int main(void) {
    char *myArray = malloc (MY_ARRAY_HEIGHT * MY_ARRAY_WIDTH);

    // initialize it, etc.
    printf("element at 3,4 = %d\n", getElement(myArray, 3, 4));
    return 0;
}