缺乏自动取款机,因此我通过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;
}
答案 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
分配的内存。