2

なぜ全部がうまくいかないのか理解できません。

malloc関数でやりたいだけですがfunc、そこから戻るとmalloc消えてしまいます...そして

*glibcが検出されました./test:free():無効なポインター:0xb76ffff4 * *

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <string.h>
#include <errno.h>

int func(char *p) {
    p=(char*)malloc(1);
    *p='a';
    printf("1. p= %c\n",*p);
    return 0;
}

int main()
{
    char *p;

    func(p);
    printf("2. p= %c\n",*p);
    free(p);

    return 0;
}
4

3 に答える 3

4
char *p;

ポインターを main() にローカルにします。別の関数に渡すことができますが、値で渡すことができるため、スコープ外で変更を加えると (ポインターが指すものを変更するなど)、「固執」しません。 .

解決策は、ポインターをポインターに渡すか、単に p のアドレスを渡すことです。

func(&p);

ただし、func() のパラメーター リストを変更することを忘れないでください。

int func(char **p)
于 2012-11-24T14:22:39.423 に答える
3

funcにいる間、pは渡されたポインタのコピーであるため、pはfunc内に作成され、funcが終了すると削除されます。

2つの解決策があります:

  1. ポインタをポインタに渡し、char ** pを実行する*p = malloc(1)と、funcはchar**pを受け入れます。
  2. 割り当てられた変数unfuncを返し、割り当てます。 p = func();
于 2012-11-24T14:11:34.177 に答える
3

main に渡すとは、関数の署名をto に 変更して&pfunc を呼び出すことを意味しますfunc(&p)func(char *p)func(char **p)

pinfuncはローカルのものであるためfuncfunc終了すると破壊され、メモリリークも発生します。

mallocそして主に、によって割り当てられたメモリを指していないポインタを解放しています。この場合もcallocそうfree(p)であり、割り当てたメモリを解放していないため、メモリリークですUndefined behaviourfunc

1番目の方法:

void func(char **p)
{
 *p=malloc(1); 
//rest of your code here 
 }

int main()
{
 int *p;
 func(&p);
 // your code here 
 free(p); 
}

2番目の方法:使いにくい**

char * func(char *p)
{
p=malloc(1);
// rest of code here 
return p; 
}

int main()
{
char *p;
p=func(p);
//rest of code here 
free(p);
}
于 2012-11-24T14:14:02.687 に答える