#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
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函数组合。
#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
#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
#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
动态分配用malloc/free函数组合。
这个也试过的,这些都是解决内存泄露的问题。
但是在编译时的警告还是没有消除掉。
#9
真用这个全局变量来写 和原来就没一点关系了~~
我只是解决你的问题而已,至于是否是你需要的答案 这个我怎么知道。
好吧 主要就是想求教下 现在存在的问题怎么处理掉 ~~ 各位达人请支招 ~~
#10
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
#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
#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
#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
#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
#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。
字符串用string,存放未知个数的string用vector。
#1
char *in_str[]={0,}改为明确的分配方式,比如char in_str[10][81],否则会有越界的风险。
#2
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函数组合。
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
#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
#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
动态分配用malloc/free函数组合。
这个也试过的,这些都是解决内存泄露的问题。
但是在编译时的警告还是没有消除掉。
#9
真用这个全局变量来写 和原来就没一点关系了~~
我只是解决你的问题而已,至于是否是你需要的答案 这个我怎么知道。
好吧 主要就是想求教下 现在存在的问题怎么处理掉 ~~ 各位达人请支招 ~~
#10
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
#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
#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
#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
#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
#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。
字符串用string,存放未知个数的string用vector。