指针数组,编译警告,内存管理,求指导。

时间:2021-09-08 19:56:53
原本打算写一个可以存储未知个数的指针数组,在setNum方法中可以按自己的需要存入自己想要个数的值,编译时产生了警告,虽然最后输出结果正确,但本人也知道这个代码会有内存泄露的危险,希望有高人能够指正一二,也让我能学到知识。

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

int setNum();
int setNum1();

int main()
{
    char *in_str[]={0,};

    setNum(in_str);
    printf("输出:%s\n",&in_str[0]);
    printf("输出:%s\n",&in_str[1]);

    setNum1(&in_str[2]);
    printf("输出:%s\n",&in_str[2]);


    return 0;
}

int setNum(char **in_str){
//int setNum(char *in_str[]){

    strcpy(&in_str[0],"abc");
    strcpy(&in_str[1],"def");

    return 0;
}

int setNum1(char *in_str){
    strcpy(in_str,"ghi");
    printf("5-----------------\n");
    return 0;
}

18 个解决方案

#1


char *in_str[]={0,}改为明确的分配方式,比如char in_str[10][81],否则会有越界的风险。

#2


引用 1 楼 turingo 的回复:
char *in_str[]={0,}改为明确的分配方式,比如char in_str[10][81],否则会有越界的风险。


int setNum(char **in_str){
//int setNum(char *in_str[]){
 
    strcpy(&in_str[0],"abc");
    strcpy(&in_str[1],"def");
 
    return 0;
}
对这一段代码需要如何修正?

还有您所说的方法我是知道的,那个方法分配的内存用不完的部分就多余出来占用住了,有没有可以动态分配内存的方法?

#3


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

char in_str[][20]={};

void setNUM()
{
    strcpy(in_str[0],"abc");
    strcpy(in_str[1],"def");
}

void setNUM1()
{
    strcpy(in_str[2],"ghi");
    printf("5---------------\n");
}

int main()
{

    setNUM();
    printf("输出:%s\n",in_str[0]);
    printf("输出:%s\n",in_str[1]);

    setNUM1();

    printf("输出:%s\n",in_str[2]);


    return 0;

}

#4


动态分配用malloc/free函数组合。

引用 2 楼 dylansxd 的回复:
Quote: 引用 1 楼 turingo 的回复:

char *in_str[]={0,}改为明确的分配方式,比如char in_str[10][81],否则会有越界的风险。


int setNum(char **in_str){
//int setNum(char *in_str[]){
 
    strcpy(&in_str[0],"abc");
    strcpy(&in_str[1],"def");
 
    return 0;
}
对这一段代码需要如何修正?

还有您所说的方法我是知道的,那个方法分配的内存用不完的部分就多余出来占用住了,有没有可以动态分配内存的方法?

#5



 char *in_str[]={0,}; //因为你没有预分配char *in_str[]的内存大小,
  //所以,可能会越界,导致内存出错的!很不安全!
可以定义 
char instr[][20];
也可以在
void setNUM()
{
    in_str[0] = (char*)malloc(4);
    in_str[1] = (char*)malloc(4);
    strcpy(in_str[0],"abc");
    strcpy(in_str[1],"def");
}
 
void setNUM1()
{
    in_str[2] = (char*)malloc(4);
    strcpy(in_str[2],"ghi");
    printf("5---------------\n");
}

#6


引用 3 楼 lilin_colin 的回复:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char in_str[][20]={};

void setNUM()
{
    strcpy(in_str[0],"abc");
    strcpy(in_str[1],"def");
}

void setNUM1()
{
    strcpy(in_str[2],"ghi");
    printf("5---------------\n");
}

int main()
{

    setNUM();
    printf("输出:%s\n",in_str[0]);
    printf("输出:%s\n",in_str[1]);

    setNUM1();

    printf("输出:%s\n",in_str[2]);


    return 0;

}


真用这个全局变量来写 和原来就没一点关系了~~

#7


引用 6 楼 dylansxd 的回复:
Quote: 引用 3 楼 lilin_colin 的回复:

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

char in_str[][20]={};

void setNUM()
{
    strcpy(in_str[0],"abc");
    strcpy(in_str[1],"def");
}

void setNUM1()
{
    strcpy(in_str[2],"ghi");
    printf("5---------------\n");
}

int main()
{

    setNUM();
    printf("输出:%s\n",in_str[0]);
    printf("输出:%s\n",in_str[1]);

    setNUM1();

    printf("输出:%s\n",in_str[2]);


    return 0;

}


真用这个全局变量来写 和原来就没一点关系了~~


我只是解决你的问题而已,至于是否是你需要的答案 这个我怎么知道。

#8


引用 4 楼 turingo 的回复:
动态分配用malloc/free函数组合。


这个也试过的,这些都是解决内存泄露的问题。
但是在编译时的警告还是没有消除掉。

#9


引用 7 楼 lilin_colin 的回复:
Quote: 引用 6 楼 dylansxd 的回复:

真用这个全局变量来写 和原来就没一点关系了~~

我只是解决你的问题而已,至于是否是你需要的答案 这个我怎么知道。


好吧 主要就是想求教下 现在存在的问题怎么处理掉 ~~ 各位达人请支招 ~~

#10


引用 5 楼 max_min_ 的回复:

 char *in_str[]={0,}; //因为你没有预分配char *in_str[]的内存大小,
  //所以,可能会越界,导致内存出错的!很不安全!
可以定义 
char instr[][20];
也可以在
void setNUM()
{
    in_str[0] = (char*)malloc(4);
    in_str[1] = (char*)malloc(4);
    strcpy(in_str[0],"abc");
    strcpy(in_str[1],"def");
}
 
void setNUM1()
{
    in_str[2] = (char*)malloc(4);
    strcpy(in_str[2],"ghi");
    printf("5---------------\n");
}


诸位说的这个内存的东东 我也理解 现在有方法在不改变初衷的情况下 对原来的代码进行修正么?

#11


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

int setNum(char *in_str);
int setNum1(char *in_str);

int main()
{
    char in_str[][20]={};

    setNum(in_str[0]);
    printf("输出:%s\n",in_str[0]);
    setNum(in_str[1]);
    printf("输出:%s\n",in_str[1]);

    setNum1(in_str[2]);
    printf("输出:%s\n",in_str[2]);


    return 0;
}

int setNum(char *in_str){


    strcpy(&in_str[0],"abc");
    strcpy(&in_str[1],"def");

    return 0;
}

int setNum1(char *in_str){
    strcpy(&in_str[2],"ghi");
    printf("5-----------------\n");
    return 0;
}


你一定要传递的话,这样是可行的。

#12


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

int setNum01();
int setNum2();

int main()
{
    char **is;

    is=malloc(2*sizeof(char *));

    setNum01(is,2);
    printf("输出:%s\n",is[0]);
    printf("输出:%s\n",is[1]);

    is=realloc(is,3*sizeof(char *));
    setNum2(is,2);
    printf("输出:%s\n",is[2]);

    free(is[2]);
    free(is[1]);
    free(is[0]);

    free(is);

    return 0;
}

int setNum01(char **in_str,int n){

    int i;

    for (i=0;i<n;i++) {
        in_str[i]=malloc(4);
        if (0==i) strcpy(in_str[i],"abc");
        if (1==i) strcpy(in_str[i],"def");
    }
    return 0;
}

int setNum2(char **in_str,int m){
    in_str[m]=malloc(4);
    strcpy(in_str[m],"ghi");
    return 0;
}

//输出:abc
//输出:def
//输出:ghi
//

#13


引用 11 楼 lilin_colin 的回复:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int setNum(char *in_str);
int setNum1(char *in_str);

int main()
{
    char in_str[][20]={};

    setNum(in_str[0]);
    printf("输出:%s\n",in_str[0]);
    setNum(in_str[1]);
    printf("输出:%s\n",in_str[1]);

    setNum1(in_str[2]);
    printf("输出:%s\n",in_str[2]);


    return 0;
}

int setNum(char *in_str){


    strcpy(&in_str[0],"abc");
    strcpy(&in_str[1],"def");

    return 0;
}

int setNum1(char *in_str){
    strcpy(&in_str[2],"ghi");
    printf("5-----------------\n");
    return 0;
}


你一定要传递的话,这样是可行的。



修改后的setNum(),就是原来代码里setNum1()这个方法。并没有做到在setNum中进行多个赋值。

#14


引用 13 楼 dylansxd 的回复:
Quote: 引用 11 楼 lilin_colin 的回复:

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

int setNum(char *in_str);
int setNum1(char *in_str);

int main()
{
    char in_str[][20]={};

    setNum(in_str[0]);
    printf("输出:%s\n",in_str[0]);
    setNum(in_str[1]);
    printf("输出:%s\n",in_str[1]);

    setNum1(in_str[2]);
    printf("输出:%s\n",in_str[2]);


    return 0;
}

int setNum(char *in_str){


    strcpy(&in_str[0],"abc");
    strcpy(&in_str[1],"def");

    return 0;
}

int setNum1(char *in_str){
    strcpy(&in_str[2],"ghi");
    printf("5-----------------\n");
    return 0;
}


你一定要传递的话,这样是可行的。



修改后的setNum(),就是原来代码里setNum1()这个方法。并没有做到在setNum中进行多个赋值。


你又不想改太多,又想着没有警告,哪有这么好的事情!

要按照你的思路来的话,  看12楼 赵老师的代码吧~~ 

#15


引用 12 楼 zhao4zhong1 的回复:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int setNum01();
int setNum2();

int main()
{
    char **is;

    is=malloc(2*sizeof(char *));

    setNum01(is,2);
    printf("输出:%s\n",is[0]);
    printf("输出:%s\n",is[1]);

    is=realloc(is,3*sizeof(char *));
    setNum2(is,2);
    printf("输出:%s\n",is[2]);

    free(is[2]);
    free(is[1]);
    free(is[0]);

    free(is);

    return 0;
}

int setNum01(char **in_str,int n){

    int i;

    for (i=0;i<n;i++) {
        in_str[i]=malloc(4);
        if (0==i) strcpy(in_str[i],"abc");
        if (1==i) strcpy(in_str[i],"def");
    }
    return 0;
}

int setNum2(char **in_str,int m){
    in_str[m]=malloc(4);
    strcpy(in_str[m],"ghi");
    return 0;
}

//输出:abc
//输出:def
//输出:ghi
//


这位大大的方法是我一开始的写法,对每个元素去分配空间。但是,我的本意想的是在不知道确定个数的情况下进行赋值工作。
比如说:我现在从数据库中查询某个字段,但是数据库中具体有几个记录我并不知道,原来我的写法是先count数据,然后用用游标取出数据后,再用这个方法把每个值都写到数组中去。
现在能让我直接用游标取出数据后,直接把这些数据放入数组中么?我贴上来的原代码虽然能够实现,但那段代码的安全性就是个渣渣,所以特地来请教一番。

#16


引用 12 楼 zhao4zhong1 的回复:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int setNum01();
int setNum2();

int main()
{
    char **is;

    is=malloc(2*sizeof(char *));

    setNum01(is,2);
    printf("输出:%s\n",is[0]);
    printf("输出:%s\n",is[1]);

    is=realloc(is,3*sizeof(char *));
    setNum2(is,2);
    printf("输出:%s\n",is[2]);

    free(is[2]);
    free(is[1]);
    free(is[0]);

    free(is);

    return 0;
}

int setNum01(char **in_str,int n){

    int i;

    for (i=0;i<n;i++) {
        in_str[i]=malloc(4);
        if (0==i) strcpy(in_str[i],"abc");
        if (1==i) strcpy(in_str[i],"def");
    }
    return 0;
}

int setNum2(char **in_str,int m){
    in_str[m]=malloc(4);
    strcpy(in_str[m],"ghi");
    return 0;
}

//输出:abc
//输出:def
//输出:ghi
//

学习
指针数组,编译警告,内存管理,求指导。

#17


引用 15 楼 dylansxd 的回复:
Quote: 引用 12 楼 zhao4zhong1 的回复:

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

int setNum01();
int setNum2();

int main()
{
    char **is;

    is=malloc(2*sizeof(char *));

    setNum01(is,2);
    printf("输出:%s\n",is[0]);
    printf("输出:%s\n",is[1]);

    is=realloc(is,3*sizeof(char *));
    setNum2(is,2);
    printf("输出:%s\n",is[2]);

    free(is[2]);
    free(is[1]);
    free(is[0]);

    free(is);

    return 0;
}

int setNum01(char **in_str,int n){

    int i;

    for (i=0;i<n;i++) {
        in_str[i]=malloc(4);
        if (0==i) strcpy(in_str[i],"abc");
        if (1==i) strcpy(in_str[i],"def");
    }
    return 0;
}

int setNum2(char **in_str,int m){
    in_str[m]=malloc(4);
    strcpy(in_str[m],"ghi");
    return 0;
}

//输出:abc
//输出:def
//输出:ghi
//


这位大大的方法是我一开始的写法,对每个元素去分配空间。但是,我的本意想的是在不知道确定个数的情况下进行赋值工作。
比如说:我现在从数据库中查询某个字段,但是数据库中具体有几个记录我并不知道,原来我的写法是先count数据,然后用用游标取出数据后,再用这个方法把每个值都写到数组中去。
现在能让我直接用游标取出数据后,直接把这些数据放入数组中么?我贴上来的原代码虽然能够实现,但那段代码的安全性就是个渣渣,所以特地来请教一番。

1.给传入的数据设置结束标志,这个标志可以不是数据的个数n,比如最后的一个数据是个特殊的值,你读取到就可以结束啦
2.声明一个全局变量来记录个数,每次申请空间后加1即可
3.如果只有一个setNum那么也可以设置一个静态局部变量,每次赋值后加1即可~
我是小白,您随便看看~~

#18


用c++啊,很轻松就能完成你的需求。
字符串用string,存放未知个数的string用vector。

#1


char *in_str[]={0,}改为明确的分配方式,比如char in_str[10][81],否则会有越界的风险。

#2


引用 1 楼 turingo 的回复:
char *in_str[]={0,}改为明确的分配方式,比如char in_str[10][81],否则会有越界的风险。


int setNum(char **in_str){
//int setNum(char *in_str[]){
 
    strcpy(&in_str[0],"abc");
    strcpy(&in_str[1],"def");
 
    return 0;
}
对这一段代码需要如何修正?

还有您所说的方法我是知道的,那个方法分配的内存用不完的部分就多余出来占用住了,有没有可以动态分配内存的方法?

#3


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

char in_str[][20]={};

void setNUM()
{
    strcpy(in_str[0],"abc");
    strcpy(in_str[1],"def");
}

void setNUM1()
{
    strcpy(in_str[2],"ghi");
    printf("5---------------\n");
}

int main()
{

    setNUM();
    printf("输出:%s\n",in_str[0]);
    printf("输出:%s\n",in_str[1]);

    setNUM1();

    printf("输出:%s\n",in_str[2]);


    return 0;

}

#4


动态分配用malloc/free函数组合。

引用 2 楼 dylansxd 的回复:
Quote: 引用 1 楼 turingo 的回复:

char *in_str[]={0,}改为明确的分配方式,比如char in_str[10][81],否则会有越界的风险。


int setNum(char **in_str){
//int setNum(char *in_str[]){
 
    strcpy(&in_str[0],"abc");
    strcpy(&in_str[1],"def");
 
    return 0;
}
对这一段代码需要如何修正?

还有您所说的方法我是知道的,那个方法分配的内存用不完的部分就多余出来占用住了,有没有可以动态分配内存的方法?

#5



 char *in_str[]={0,}; //因为你没有预分配char *in_str[]的内存大小,
  //所以,可能会越界,导致内存出错的!很不安全!
可以定义 
char instr[][20];
也可以在
void setNUM()
{
    in_str[0] = (char*)malloc(4);
    in_str[1] = (char*)malloc(4);
    strcpy(in_str[0],"abc");
    strcpy(in_str[1],"def");
}
 
void setNUM1()
{
    in_str[2] = (char*)malloc(4);
    strcpy(in_str[2],"ghi");
    printf("5---------------\n");
}

#6


引用 3 楼 lilin_colin 的回复:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char in_str[][20]={};

void setNUM()
{
    strcpy(in_str[0],"abc");
    strcpy(in_str[1],"def");
}

void setNUM1()
{
    strcpy(in_str[2],"ghi");
    printf("5---------------\n");
}

int main()
{

    setNUM();
    printf("输出:%s\n",in_str[0]);
    printf("输出:%s\n",in_str[1]);

    setNUM1();

    printf("输出:%s\n",in_str[2]);


    return 0;

}


真用这个全局变量来写 和原来就没一点关系了~~

#7


引用 6 楼 dylansxd 的回复:
Quote: 引用 3 楼 lilin_colin 的回复:

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

char in_str[][20]={};

void setNUM()
{
    strcpy(in_str[0],"abc");
    strcpy(in_str[1],"def");
}

void setNUM1()
{
    strcpy(in_str[2],"ghi");
    printf("5---------------\n");
}

int main()
{

    setNUM();
    printf("输出:%s\n",in_str[0]);
    printf("输出:%s\n",in_str[1]);

    setNUM1();

    printf("输出:%s\n",in_str[2]);


    return 0;

}


真用这个全局变量来写 和原来就没一点关系了~~


我只是解决你的问题而已,至于是否是你需要的答案 这个我怎么知道。

#8


引用 4 楼 turingo 的回复:
动态分配用malloc/free函数组合。


这个也试过的,这些都是解决内存泄露的问题。
但是在编译时的警告还是没有消除掉。

#9


引用 7 楼 lilin_colin 的回复:
Quote: 引用 6 楼 dylansxd 的回复:

真用这个全局变量来写 和原来就没一点关系了~~

我只是解决你的问题而已,至于是否是你需要的答案 这个我怎么知道。


好吧 主要就是想求教下 现在存在的问题怎么处理掉 ~~ 各位达人请支招 ~~

#10


引用 5 楼 max_min_ 的回复:

 char *in_str[]={0,}; //因为你没有预分配char *in_str[]的内存大小,
  //所以,可能会越界,导致内存出错的!很不安全!
可以定义 
char instr[][20];
也可以在
void setNUM()
{
    in_str[0] = (char*)malloc(4);
    in_str[1] = (char*)malloc(4);
    strcpy(in_str[0],"abc");
    strcpy(in_str[1],"def");
}
 
void setNUM1()
{
    in_str[2] = (char*)malloc(4);
    strcpy(in_str[2],"ghi");
    printf("5---------------\n");
}


诸位说的这个内存的东东 我也理解 现在有方法在不改变初衷的情况下 对原来的代码进行修正么?

#11


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

int setNum(char *in_str);
int setNum1(char *in_str);

int main()
{
    char in_str[][20]={};

    setNum(in_str[0]);
    printf("输出:%s\n",in_str[0]);
    setNum(in_str[1]);
    printf("输出:%s\n",in_str[1]);

    setNum1(in_str[2]);
    printf("输出:%s\n",in_str[2]);


    return 0;
}

int setNum(char *in_str){


    strcpy(&in_str[0],"abc");
    strcpy(&in_str[1],"def");

    return 0;
}

int setNum1(char *in_str){
    strcpy(&in_str[2],"ghi");
    printf("5-----------------\n");
    return 0;
}


你一定要传递的话,这样是可行的。

#12


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

int setNum01();
int setNum2();

int main()
{
    char **is;

    is=malloc(2*sizeof(char *));

    setNum01(is,2);
    printf("输出:%s\n",is[0]);
    printf("输出:%s\n",is[1]);

    is=realloc(is,3*sizeof(char *));
    setNum2(is,2);
    printf("输出:%s\n",is[2]);

    free(is[2]);
    free(is[1]);
    free(is[0]);

    free(is);

    return 0;
}

int setNum01(char **in_str,int n){

    int i;

    for (i=0;i<n;i++) {
        in_str[i]=malloc(4);
        if (0==i) strcpy(in_str[i],"abc");
        if (1==i) strcpy(in_str[i],"def");
    }
    return 0;
}

int setNum2(char **in_str,int m){
    in_str[m]=malloc(4);
    strcpy(in_str[m],"ghi");
    return 0;
}

//输出:abc
//输出:def
//输出:ghi
//

#13


引用 11 楼 lilin_colin 的回复:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int setNum(char *in_str);
int setNum1(char *in_str);

int main()
{
    char in_str[][20]={};

    setNum(in_str[0]);
    printf("输出:%s\n",in_str[0]);
    setNum(in_str[1]);
    printf("输出:%s\n",in_str[1]);

    setNum1(in_str[2]);
    printf("输出:%s\n",in_str[2]);


    return 0;
}

int setNum(char *in_str){


    strcpy(&in_str[0],"abc");
    strcpy(&in_str[1],"def");

    return 0;
}

int setNum1(char *in_str){
    strcpy(&in_str[2],"ghi");
    printf("5-----------------\n");
    return 0;
}


你一定要传递的话,这样是可行的。



修改后的setNum(),就是原来代码里setNum1()这个方法。并没有做到在setNum中进行多个赋值。

#14


引用 13 楼 dylansxd 的回复:
Quote: 引用 11 楼 lilin_colin 的回复:

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

int setNum(char *in_str);
int setNum1(char *in_str);

int main()
{
    char in_str[][20]={};

    setNum(in_str[0]);
    printf("输出:%s\n",in_str[0]);
    setNum(in_str[1]);
    printf("输出:%s\n",in_str[1]);

    setNum1(in_str[2]);
    printf("输出:%s\n",in_str[2]);


    return 0;
}

int setNum(char *in_str){


    strcpy(&in_str[0],"abc");
    strcpy(&in_str[1],"def");

    return 0;
}

int setNum1(char *in_str){
    strcpy(&in_str[2],"ghi");
    printf("5-----------------\n");
    return 0;
}


你一定要传递的话,这样是可行的。



修改后的setNum(),就是原来代码里setNum1()这个方法。并没有做到在setNum中进行多个赋值。


你又不想改太多,又想着没有警告,哪有这么好的事情!

要按照你的思路来的话,  看12楼 赵老师的代码吧~~ 

#15


引用 12 楼 zhao4zhong1 的回复:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int setNum01();
int setNum2();

int main()
{
    char **is;

    is=malloc(2*sizeof(char *));

    setNum01(is,2);
    printf("输出:%s\n",is[0]);
    printf("输出:%s\n",is[1]);

    is=realloc(is,3*sizeof(char *));
    setNum2(is,2);
    printf("输出:%s\n",is[2]);

    free(is[2]);
    free(is[1]);
    free(is[0]);

    free(is);

    return 0;
}

int setNum01(char **in_str,int n){

    int i;

    for (i=0;i<n;i++) {
        in_str[i]=malloc(4);
        if (0==i) strcpy(in_str[i],"abc");
        if (1==i) strcpy(in_str[i],"def");
    }
    return 0;
}

int setNum2(char **in_str,int m){
    in_str[m]=malloc(4);
    strcpy(in_str[m],"ghi");
    return 0;
}

//输出:abc
//输出:def
//输出:ghi
//


这位大大的方法是我一开始的写法,对每个元素去分配空间。但是,我的本意想的是在不知道确定个数的情况下进行赋值工作。
比如说:我现在从数据库中查询某个字段,但是数据库中具体有几个记录我并不知道,原来我的写法是先count数据,然后用用游标取出数据后,再用这个方法把每个值都写到数组中去。
现在能让我直接用游标取出数据后,直接把这些数据放入数组中么?我贴上来的原代码虽然能够实现,但那段代码的安全性就是个渣渣,所以特地来请教一番。

#16


引用 12 楼 zhao4zhong1 的回复:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int setNum01();
int setNum2();

int main()
{
    char **is;

    is=malloc(2*sizeof(char *));

    setNum01(is,2);
    printf("输出:%s\n",is[0]);
    printf("输出:%s\n",is[1]);

    is=realloc(is,3*sizeof(char *));
    setNum2(is,2);
    printf("输出:%s\n",is[2]);

    free(is[2]);
    free(is[1]);
    free(is[0]);

    free(is);

    return 0;
}

int setNum01(char **in_str,int n){

    int i;

    for (i=0;i<n;i++) {
        in_str[i]=malloc(4);
        if (0==i) strcpy(in_str[i],"abc");
        if (1==i) strcpy(in_str[i],"def");
    }
    return 0;
}

int setNum2(char **in_str,int m){
    in_str[m]=malloc(4);
    strcpy(in_str[m],"ghi");
    return 0;
}

//输出:abc
//输出:def
//输出:ghi
//

学习
指针数组,编译警告,内存管理,求指导。

#17


引用 15 楼 dylansxd 的回复:
Quote: 引用 12 楼 zhao4zhong1 的回复:

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

int setNum01();
int setNum2();

int main()
{
    char **is;

    is=malloc(2*sizeof(char *));

    setNum01(is,2);
    printf("输出:%s\n",is[0]);
    printf("输出:%s\n",is[1]);

    is=realloc(is,3*sizeof(char *));
    setNum2(is,2);
    printf("输出:%s\n",is[2]);

    free(is[2]);
    free(is[1]);
    free(is[0]);

    free(is);

    return 0;
}

int setNum01(char **in_str,int n){

    int i;

    for (i=0;i<n;i++) {
        in_str[i]=malloc(4);
        if (0==i) strcpy(in_str[i],"abc");
        if (1==i) strcpy(in_str[i],"def");
    }
    return 0;
}

int setNum2(char **in_str,int m){
    in_str[m]=malloc(4);
    strcpy(in_str[m],"ghi");
    return 0;
}

//输出:abc
//输出:def
//输出:ghi
//


这位大大的方法是我一开始的写法,对每个元素去分配空间。但是,我的本意想的是在不知道确定个数的情况下进行赋值工作。
比如说:我现在从数据库中查询某个字段,但是数据库中具体有几个记录我并不知道,原来我的写法是先count数据,然后用用游标取出数据后,再用这个方法把每个值都写到数组中去。
现在能让我直接用游标取出数据后,直接把这些数据放入数组中么?我贴上来的原代码虽然能够实现,但那段代码的安全性就是个渣渣,所以特地来请教一番。

1.给传入的数据设置结束标志,这个标志可以不是数据的个数n,比如最后的一个数据是个特殊的值,你读取到就可以结束啦
2.声明一个全局变量来记录个数,每次申请空间后加1即可
3.如果只有一个setNum那么也可以设置一个静态局部变量,每次赋值后加1即可~
我是小白,您随便看看~~

#18


用c++啊,很轻松就能完成你的需求。
字符串用string,存放未知个数的string用vector。