修改传递给C中函数的2D char数组

时间:2014-04-16 04:00:15

标签: c arrays

缺乏自动取款机,因此我通过PayPal向第一个人提供0.25美元,以指出我在此代码段中做错了什么 - 我希望这不会违反网站规则或侮辱任何人。< / p>

我想在函数中修改多维数组。它在函数中被修改,但是当scope返回main函数时,数组不变。

无法修改函数标头。谢谢你帮助我。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您不需要在函数aligned = (char**) malloc(2*sizeof(char*));中通过getAlignment再次分配2D数组,因为您已经在main中分配了它。

您需要分配数组的每个元素,如

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分配的内存。