2013-04-25 2 views
-2

i передать buf для массива first is schArray [i] [0] = buf;Почему вторая программная 2D-матрица 2D заменяет первую строку

, например, мне нужно 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 
+1

'schArray [Q] = (символ **) таНос (SizeOf (Char) * 100)' 'должно быть schArray [Q] = таНос (SizeOf (символ *) * 100)' (правильный тип; без литья); кроме этого, ваш вопрос, к сожалению, не ясен. Можете ли вы предоставить фактический и ожидаемый результат вашего приложения? – anatolyg

ответ

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().

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; 
} 
+0

О, кстати, обратите внимание, что в 'getElement' функция' y * MY_ARRAY_WIDTH' не является опечаткой, которая может показаться сначала (умножая значение y по ширине), это как раз то, как мы выкладываем наши данные в памяти.Кроме того, объявляя 'getElement' как' static inline', мы устраняем служебные данные вызова функции и предоставляем компилятору дополнительные возможности для оптимизации. Сгенерированный код (при включении оптимизации) скорее всего будет идентичен доступу к массиву 'myarray [3] [4]' C, если он был объявлен как «char myarray [MY_ARRAY_WIDTH] [MY_ARRAY_HEIGHT];' –

Смежные вопросы