-2

我首先将 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
4

2 回答 2

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声明的malloc()

于 2013-04-25T19:32:51.053 回答
1

请不要将大量指针数组分配给指向字符的指针。初学 C 程序员通常一开始就习惯于使用数组。然后他们想进入更复杂的领域并开始使用二维数组。然后他们意识到他们必须将他们的东西移动到堆中,然后他们似乎无法放弃 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;
}
于 2013-04-25T19:33:16.947 回答