嗨,我的 C 作業需要幫助。我需要修改一個動態二維陣列,所以我將一個指向它的指標傳遞給函式,不幸的是它似乎沒有修改它而只是復制它并保持不變,我已經嘗試了一切,有人可以幫忙嗎?
int getUniqueRelMembersCount(universe_t u, relation_t rel, char **members)
{
int memberCount = 0;
//count and dynamically populate passed 2d array with unique members of rel
return memberCount;
}
我如何呼叫函式:
char **members = malloc(sizeof(members));
int len = getUniqueRelMembersCount(universe, relations.relations[0], members);
printf("%d\n", len);
printf("%s", members[0]);
for (int i = 0; i < len; i )
{
free(members[i]);
}
free(members);
輸出:
3
分段故障
編輯:好的,我嘗試使用您的答案進行演示,但我仍然感到困惑:
int populate(char ***members)
{
*members = malloc(sizeof(*members));
for (int i = 0; i < 3; i )
{
char string[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
*members = realloc(*members, (i 1) * sizeof(char *));
*members[i] = malloc(strlen(string) * sizeof(char));
strcpy(*members[i], string);
}
return 0;
}
int main()
{
char **members;
populate(&members);
printf("%s\n", members[0]);
printf("%s\n", members[1]);
printf("%s\n", members[2]);
return 0;
}
輸出:
你好
甕
(空值)
uj5u.com熱心網友回復:
它確實修改了陣列。它甚至可能釋放它。那不是問題。
問題是它也會更改指標 ( members = realloc(...)),但您不會將此更改傳播給呼叫者。盡管名稱相同,但members函式中命名的變數和members呼叫者中命名的變數是不同的變數。在您之后realloc,members變數 inmain可能不再有效。
簡化演示:
void f(int members) {
printf("%d\n", members); // 2
members = 3;
printf("%d\n", members); // 3
}
int main(void) {
int members = 2;
printf("%d\n", members); // 2
f(members);
printf("%d\n", members); // 2
return 0;
}
您可以回傳修改后的值。在這種情況下,最好傳遞一個指向變數的指標。
int f(int *membersPtr) {
printf("%d\n", *membersPtr); // 2
*membersPtr = 3;
printf("%d\n", *membersPtr); // 3
}
int main(void) {
int members = 2;
printf("%d\n", members); // 2
f(&members);
printf("%d\n", members); // 3
return 0;
}
在您的完整程式中,指向變數的指標的型別為char***。
uj5u.com熱心網友回復:
您的以下代碼應該不起作用:
char **members = malloc(sizeof(members));
int len = getUniqueRelMembersCount(universe, relations.relations[0], members);
因為:
- 您不能使用“成員”值來初始化“成員”;
- malloc 回傳符號指標,但不回傳雙指標。
嘗試這個:
int members_count = 10;
char *members = malloc(members_count);
int len = getUniqueRelMembersCount(universe, relations.relations[0], &members);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360373.html
