关于C中字符串指针函数返回值

关于C中字符串指针函数返回值,第1张

一般情况下会输出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型,呵呵,明白了没

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12156460.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存