我首先将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
答案 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;
}