【问题标题】:Passing a double pointer to modify string传递一个双指针来修改字符串
【发布时间】:2013-01-27 05:28:20
【问题描述】:

所以我有一个程序有时可以工作,但有时却不行。有时放入 printf 语句会使程序神奇地工作(有时 printf 会使它中断)。这让我觉得就指针/分配而言我搞砸了,因为我仍然无法解决一些问题。该程序太长,无法发布所有代码,所以我只显示我认为问题所在。

我得到了一个函数,它接受一个 FILE* 和一些 char** 作为参数,返回一个 int。该函数正在解析文件,将必要的字符串存储到双指针指向的位置。

这是我使用函数的方式(很多代码被省略/简化):

char **s1;
char **s2;
char **s3;

int main(int argc, char ** argv){
    s1 = (char**)malloc(20);
    s2 = (char**)malloc(20);
    s3 = (char**)malloc(20);

    /* Unnecessary code omitted */
    read(inFile);
}

int read(FILE* in){
    /* omitted code */
    parse(in,s1,s2,s3);
    printf("%s",*s1); /* This is to show how I access the strings */
}

我很确定在我的程序的某个地方,这些字符串被覆盖了,因为我没有正确分配内存。希望我的错误在我给出的代码 sn-p 中是可见的,因为我没有很多其他理论可以解释为什么我的代码不起作用

【问题讨论】:

  • 你真的不需要双指针。如果必须为函数内部的指针分配内存,则需要一个双指针。
  • 正如 Alok 上面所说,您不需要双指针,而且由于这被标记为 C 代码,您也可以安全地省略 malloc 的强制转换

标签: c


【解决方案1】:

由于parse() 的API 是用char ** 指定的,我相信可以安全地假设您确实确实在调用中需要双重间接,但在声明中不需要。

因此,您可能需要跳过malloc() 电话并说:

char *s1, *s2, *s3;
...
parse(in, &s1, &s2, &s3);

这将允许parse() 分配自己的空间并通过修改指针本身将三个指针返回给它的调用者。感谢您将问题提炼为核心的努力,但看到 parse() 的原型可能会很有趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多