一般情况下会输出anggge
但如果运行的程序很多,可能会输出乱码
原因在于char
a[]后a是作为一个局部数组变量由系统自动分配的内存,在ge函数执行结束后将a的首地址返回调用者,但a的内存空间已经释放掉了,但其中的内容并不会立刻清空或被填入其它内容。所以一般情况下main的printf以%s的格式输出从ge返回的指针开始的字符串时,可以正确输出原来字符串,但如果同时运行的程序较多,可能很快就在a原来的内存空间中填入数据,这样就极可能输出乱码,同时由于%s是遇到'\0'才停止,所以输出的长度不能确定。
所以要返回指针,一般要求该指针指向的内存是在外部或者内部手动分配的,也就是由malloc之类的内存函数分配获得的,同时在手动分配的内存使用完毕之后要及时释放,否则可能造成内存泄露
你好
从问题来看,似乎你对于指针的概念没太理解。指针变量中存储的是内存中的地址,而实际的数据放在这个地址中。
按照这段代码来说,int 声明的指针指向内存中的一块地址,而在这块地址中存储着一个整形数值。所以要返回这样的值,也就相当于是返回一个内存地址。因此,在程序中有两种具体的解决办法:
1在调用函数的时候,直接将变量的指针(即内存地址)作为参数传入,在函数执行的时候,就会自动对内存中相应地址的数据进行 *** 作。使用这种方法也就不需要返回值了。具体到这段代码中,就是在Main中声明int tempA[10],把foo函数声明为void foo(int a[10]),调用时用foo(tempA),在foo函数中直接使用a[10]即可。
2直接把内存地址作为返回值,因为在C中,数组名就是数组首元素的指针,因此直接返回数组名就可以了,即return a即可。如果是普通变量,要用取内存地址的运算符&,比如声明了整型变量 int i,就可以return &i。这与printf函数中的使用方法是相通的。
按照补充的内容:
a-------->a1-------->i1
|-------->a2-------->i2
|……………………
|-------->an-------->im
这样的调用方法,只能保证a1-an不被修改,怎么保证i1-im不被修改?
希望以上回答能帮到你。PS很久没用C了,如果哪里出了差错,请指正。
第二种方法是因为类型不匹配(double与(double()[ROW])产生错误,而且
((double ()[row])matrix);
里的[row]是一个变量,而指向数组的指针
double (matrix)[ROW]里的ROW只能使用常量,所以这里也有一个错误。
由于指向数组的指针指向的数组长度(即第一维)必须是确定的常量,所以你这种行列皆不确定的数组不能用这种形式返回。
我觉得用第一种形式好一点,访问二维数组a[i][j]可以转换成访问一维数组a[irow+j];//row是列数
如果非要返回二维数组的话,我想用指针数组会好一点,不过分配空间的时候就麻烦一点。
指针可以返回,但是要注意函数内部的数组用指针返回后,到了函数外面,这个数组已经被释放了。所以是个野指针,用了就死机!这种情况可以动态申请一段内存,比如malloc函数,用完后再用free函数释放内存。
#include<stdioh>
#include<stdlibh>
float Input(int& len)
{
int length;
int i;
float a;
printf("Enter a number to sort numbers:\n");
scanf("%d",&length);
len = length;
a=(float )malloc(lengthsizeof(float));
printf("Enter the number %d (Digital separated by whitespace or the end of line):\n",length);
for(i=0;i<length;i++)
{
scanf("%f",&a[i]);
}
return a;
}
void Sort(float a, int len)
{
int i,j,length;
length = len;
for(i=0;i<length-1;i++)
for(j=0;j<length-1-i;j++)
if(a[j]>a[j+1])
{
a[j]=a[j]+a[j+1];
a[j+1]=a[j]-a[j+1];
a[j]=a[j]-a[j+1];
}
}
void main()
{
float date = NULL;
int len;
int i;
date = Input(len);
Sort(date, len);
printf("This %d number from small to large order is the order of:\n",len);
for(i=0;i<len;i++)
printf("%-72f\n",date[i]);
free(date);
}
我改了一下你的程序,不太好看,只是给你看看怎么返回指针。
搞定
额 , 现在可以直接用b , 因为 数组 变量b 本身是不能修改的, 而且 函数结束后 b 的生命就结束了。
所以 我在 b的前面 加了static
for(i=r;(ch+i)!='\0';i++) //找到 目标函数的结尾
for(j=0;j<=i-r+1;j++) // i-r 是 从m到最后字符串的长度
(b+j)=(ch+r-1+j); //拷贝
char x= b;
return x;
复制以下的
#include<stdioh>
void main()
{
char a[20];int m=0;charfuzhi(char,int);
printf("输入字符:");
gets(a);
printf("输入起始位数:");
scanf("%d",&m);
printf("%s\n",fuzhi(a,m));
}
char fuzhi(charch,int r)
{static char b[20];int i,j;
for(i=r;(ch+i)!='\0';i++)
for(j=0;j<=i-r+1;j++)
(b+j)=(ch+r-1+j);
char x= b;
return x;
}
#include<stdioh>void
maxfunction(int);void
main(){
int
max;
maxfunction(&max);
printf("三个数中最大值是%d",max);
fflush(stdin);
getchar();}void
maxfunction(int
i){
int
a,b,c,max;
printf("输入三个数?");
scanf_s("%d%d%d",&a,&b,&c);
max=a>ba:b;
max=max>cmax:c;
i=max;}如有疑问欢迎提问
#include<stdioh>
#include<stringh>
#include<iostream>
#include<fstream>
#include<stdlibh>
using namespace std;
typedef struct point{ //结构体设计
int A, B, C, a, b, c, id, n;
}point;
point ReadFile(){
static point ss[110];
char data[50] = {'\0'};
int m1 = 0, n = 0, k, i;
for(int i = 0; i < 100; i++){
ss[i]id=rand()%10;
ss[i]A=rand()%10;
ss[i]B=rand()%10;
ss[i]C=rand()%10;
ss[i]D=rand()%10;
ss[i]E=rand()%10;
ss[i]F=rand()%10;
}
return ss;
}
void main(){
point male[110], female[110], players[110];
male = ReadFile();
}
ss是局部变量,有效范围只局限于定义ss的函数体内,即只在函数ReadFile里有效,函数返回后,ss就失效了。
你可以在ReadFile里定义ss的前面加上static修饰,表示这个是静态局部变量,静态局部变量的内存有效范围可以全局有效。
static point ss[110];
另外,结构体的typedef定义不完整。
这个问题一个较为妥善的方法是把数组定义在主函数,再传入数组地址给自定义函数,如果你非要在自定义函数里定义也行,至于是否需要设置为static,那得看情况,因为函数退出时栈空间并不是马上被刷新,如果你能保证该栈空间在你访问前没被释放就没必要定义为static,但是保险起见定义static更好,因为你可能不知道到底该内存是不是被重新写入了数据,至于你说要返回指向指针的指针,我举个例子,int
fun(),这个就是返回一个指向指针的指针,其指向的指针指向int型,呵呵,明白了没
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)