2014-04-16 3 views
0

Отсутствие денег в банкомате, поэтому я предлагаю $ 0,25 через paypal первому человеку, чтобы указать, что я сделал не так в этом фрагменте кода. Надеюсь, это не нарушит сайт. правил или оскорблять кого угодно.Изменение массива 2D-символов, переданного функции в C

Я хочу изменить многомерный массив в функции. Он изменяется во время функции, но когда область возвращается к основной функции, массив не изменяется.

Невозможно изменить заголовки функций. Спасибо, что помогли мне.

void getAlignment(char*s1, char*s2, char*s3, char*aligned[]) 
{ 
    /*********************** 
    Code here which assigns 
    char**tmp to "different" "words" 
    ***********************/ 

printf("tmp in getAlignment function\n"); 
printf("%s %s\n", tmp[0], tmp[1]); // prints "different words", as expected 
    aligned = tmp; 
} 

int main(void) 
{ 
    // skipped some code 

    char** aligned = (char**)malloc(sizeof(char*)*2); 
    aligned[0] = "should"; 
    aligned[1] = "change"; 

    printf("%s %s\n", aligned[0], aligned[1]); // prints "should change", as expected 
    getAlignment(s1, s2, transcript, aligned); // how do i change aligned during this call? 
    printf("%s %s\n", aligned[0], aligned[1]); // prints "should change" 

    return 0; 
} 
+0

Что вы хотите сделать в функции getAlignment()? Каков ожидаемый результат? – user207064

+0

Идея заключается в том, что я 'aligned' в' main', и я хочу изменить его в 'getAlignment', указав на то, что метод' getAlignment' изменился. – Rob

ответ

1

Когда вы пишете внутри getAlignment:

aligned = (char**) malloc(2*sizeof(char*)); 

вы делаете точку указателя GetAlignment::aligned в какой-то новой памяти. Он больше не указывает на память, на которую указывает main::aligned. Когда вы работаете с этой новой памятью, это не влияет на память, на которую указывал main::aligned.

(Примечание. :: не является синтаксисом C, но мое значение состоит в том, чтобы устранить двузначные переменные, которые оба называются aligned в их локальной области, несмотря на то, что они представляют собой две отдельные переменные).

Если вы намерены, что код в getAlignment изменяет указанную память на main::aligned, тогда просто удалите указанную выше строку.

Если Ваше намерение состоит в том, что getAlignment быть в состоянии выделить новую память, и main::aligned быть переключена использовать эту новую память, то вы должны пройти main::aligned по ссылке (то есть добавить дополнительный уровень косвенности при вызове функции). И не забывайте free() ранее выделенную память.

BTW don't cast malloc.

+0

это «заострило» меня в правильном направлении (bu dum pshhh). пожалуйста, дайте мне знать вашу paypal, если вы хотите получить небольшую компенсацию за вашу помощь. Огромное спасибо. – Rob

+0

Не используйте paypal ... это зло. счастлив помочь в любом случае –

0

Вам не нужно выделять 2D массив снова aligned = (char**) malloc(2*sizeof(char*)); в функции getAlignment, потому что вы уже выделили его в основной.

Вам потребуется выделить каждый элемент массива как

int alignedStrLen = strlen(s3); 
aligned[0] = malloc((alignedStrLen+1)*sizeof(char)); 
aligned[0][alignedStrLen] = '\0'; 
aligned[1] = malloc((alignedStrLen+1)*sizeof(char)); 
aligned[1][alignedStrLen] = '\0'; 

А, и вы должны освободить память, выделенную malloc.

+0

, скажем, в 'main', я только что объявил' char ** aligned' w/out, инициализируя его. Идея в том, что я хочу, чтобы функция 'getAlignment' изменяла' aligned', независимо от того, на что указывает 'aligned'. – Rob

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