先来看下面这段小程序test.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void init(char *p)
{
    p = (char *)malloc(100);
}

int main()
{
    char *p = NULL;
    init(p);	

    if(p)
    {
        strcpy(p, "hello");	
        printf("%s \n", p);
    }
    else
    {
        printf("%s", "p not init");
    }
    free(p);
    return 0;
}

这段程序会输出什么呢?

编译:gcc test.c -o test
执行:./test

发现打印的是”p not init”,这是为什么呢?原因很简单:因为c/c++中是会为指针分配内存空间的,指针传递就跟普通的数据类型一样,会拷贝p的副本_p,_p和p的内容一样,都指向同一个对象,此时都为NULL,但是_p和p自身的内存地址不一样。调用init(char *p)只是让副本_p指向了一块分配的内存空间,p还是NULL。知道了原因就好处理,下面提供三种解决方案:
方法1. 把char *p = NULL改成char p[100] = {0},这样传过去的是字符数组的首地址。
方法2. 把init函数的参数改成char **p,调用的时候传指针自身的地址,init(&p):

void init(char **p)
{
	*p = (char *)malloc(100);
}

方法3:给init函数添加char *类型的返回值,把副本的值赋值给p:

char* init(char *p)
{
    p = (char *)malloc(100);
    return p;
}

lua面向对象模拟简介

lua不是面向对象语言,但可以通过表(table)和元表(metatable)来模拟。table 是 lua 中唯一的一种数据结构,它可以用来描述原始的数组、符号表、集合、 记录、...

阅读全文

在c/c++中调用lua函数

上篇文章完成了在lua中调用c/c++函数,现在来实现在c/c++中调用lua函数。 首先完成lua代码,创建sum.lua: function add(x, y) return x + y; end 为了...

阅读全文

在lua中调用c/c++函数

lua是一种轻量级的脚本语言,用来扩展c和c++非常好,在游戏开发中使用很普遍。 首先下载lua,因为我是在win7下,所以我这里下载了luaforwindows,安装到F:\Lu...

阅读全文

2 条评论

  1. Lindo demais!SOJA como sempre arrebentando tudo.Parceria com Rappa,melhor ainda!Simplesmente sem comentario!SOJA é bem mais que uma banda,é bem mais do que criar músicas. Eles estão mudando o mundo,mudando os conceitos das pessoas! Isso é maravilhoso!

欢迎留言