我想问一下改变函数中的指针,也就是改变它的地址,而不是它指向的值。在我的函数中,可能会出现需要将指针扩展为二维字符串数组的情况。起初,我将通常的传递给函数char** argv,但是当扩展发生时argv,它本身以不同的方式发生了变化argv。main我尝试传入函数char*** argv并使用(*argv),就像argv前一个案例一样,这一切都奏效了。我大概可以理解为什么会发生这种情况,但我想听听这种情况的更多学术理由。而且我还想问为什么如果我在函数中传递一个二维数组清理argv,那么似乎一切正常,清理函数代码:
void freeArgv(char** argv, const size_t argc) {
if (argv == NULL) {
return;
}
for (size_t i = 0; i < argc; i++) {
if (argv[i] != NULL) {
free(argv[i]);
} else {
break;
}
}
free(argv);
}
无论您通过值传递给函数(在 C 中,所有内容都是通过值传递的;通过指针调用按值传递的指针在糟糕的教科书中只是脑雾......) - 它只创建一个副本,它是一个局部变量的功能。
当您将指针传递给函数时,会创建它的副本。因此,只要你改变它所指向的东西,这些改变就会保留在指定的内存中。但是当您更改传递的指针本身时,您会更改局部变量,该变量会在函数结束时消失。
在函数中你并不感到惊讶
变量是否会消失而
p不会以任何方式影响函数外部的变量?但在这儿
p- 完全相同的局部变量,仅由传递给函数的参数值初始化。这或多或少清楚吗?
一切都在你的释放函数中工作,因为所需要的只是指针的值,而不是变量本身。
自己检查一下 - 之后
该值
argv将保持不变。但现在它将指向已释放的内存。