Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将返回的cstring赋值给变量_C_Arrays_Return Value_Cstring - Fatal编程技术网

将返回的cstring赋值给变量

将返回的cstring赋值给变量,c,arrays,return-value,cstring,C,Arrays,Return Value,Cstring,我正在编写一个函数,它反转不在适当位置的cstring,但返回反转的cstring。返回类型应该是什么 #include <stdio.h> #include <string.h> const char* reverStr(const char *str) { char revStr[strlen(str)]; int i; for(i = strlen(str)-1; i >= 0; i--) revStr[strlen(

我正在编写一个函数,它反转不在适当位置的cstring,但返回反转的cstring。返回类型应该是什么

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

const char* reverStr(const char *str)
{
    char revStr[strlen(str)];
    int i;
    for(i = strlen(str)-1; i >= 0; i--)
        revStr[strlen(str)-1-i] = str[i];
    printf("returned value should be %s\n", revStr);
    return revStr;
}

int main()
{
    char aStr[] = "hello";
    char aStr2[] = "goodbye";
    printf("%s %s", aStr, aStr2);
    char* tmp = reverStr(aStr);//tmp now has garbage
    printf("\n%s", tmp);
    printf(" %s", aStr);
    return 0;
}
#包括
#包括
常量字符*reverStr(常量字符*str)
{
char revStr[strlen(str)];
int i;
对于(i=strlen(str)-1;i>=0;i--)
revStr[strlen(str)-1-i]=str[i];
printf(“返回值应为%s\n”,revStr);
返回revStr;
}
int main()
{
char aStr[]=“你好”;
char ast2[]=“再见”;
printf(“%s%s”,应科院,应科院2);
char*tmp=reverStr(aStr);//tmp现在有垃圾
printf(“\n%s”,tmp);
printf(“%s”,应科院);
返回0;
}
给予 警告:函数返回局部变量的地址[默认启用]| 警告:初始化从指针目标类型中丢弃“const”限定符[默认情况下已启用]|


我尝试将
char*tmp
更改为
char tmp[]
,但它无法编译。当我应该使用数组和指针时,我会感到困惑。

revStr
是一个数组,在
reverStr
函数退出后不再存在。欲了解更多信息,请阅读:

可修改的l值不能具有数组类型。l值是一个表达式,可以出现在赋值的左侧。当您想要声明许多相同类型的变量时,可以使用数组,并且可以很容易地对其进行索引,因为它的布局在某种意义上是连续的

当您希望不断更改变量指向的地址的值时,可以使用指针

您可以这样做:

char * p = "test";
p = "new";
但你不能这样做:

    char p[] = "test";
    char *p1 ="test1";
    p = p1; //error
因为它们的(数组和指针)类型不同,并且数组
p
是不可修改的l值

这是你的固定电话。我试着少做些修改。

charrevstr[strlen(str)]
分配一个局部变量(数组),当您超出
reverStr
函数的作用域时,它的内存被释放,这将导致进一步使用它的指针UB(大多数情况下为SEGFULT)

正确的方法是在堆上分配字符串并像下面这样返回其指针

char* x = (char*)malloc(strlen(str));
...
return x;

这需要用户负责释放内存。或者您可以为结果字符串向函数传递另一个参数。

我认为您应该使用malloc分配一个新字符串

const char* reverStr(const char *str)
{
    char *revStr;//using pointer 
    int i;

    revStr = (char*)malloc(strlen(str));//dynamic allocation
    for(i = strlen(str)-1; i >= 0; i--)
        revStr[strlen(str)-1-i] = str[i];
    printf("returned value should be %s\n", revStr);
    return revStr;
}
数组是指向连续内存头的指针

例如:

int a[] = {1,2,3};
内存中的地址可能是:

-1000

{1}

-1004

-1008

-1012

1000、1004和1012是内存中地址的值

因此,数组a的值应该是1000

printf("%d",a);// Yes, you can do it and you may get the value of 1000.
此外,还可以使用以下代码

int a[] = {1,2,3};
int *b;
b= a;
printf("%d",b[1]);// you will get "2".

可以考虑指针是一个集合,数组在集合中。

因此,你不能这样做

int a[] = {1,2,3};
int c = 0;
int *b  = &c;

a = b;//error

除了返回一个局部变量(Acme已经解释过这一点)
char revStr[strlen(str)]
还有缺陷:终止的
0
-字符总是需要空间。因此,您必须在其中放置一个
+1
,并注意最后一个字符是否设置为
0
@JensGustedt我同意您的推理,但通过测试,它工作正常……您很幸运,超出了数组的限制(而您的
printf
就是这样做的)没有定义的行为。任何事情都有可能发生,特别是你的程序可能会崩溃。@Jens有一个很好的观点,为什么不向strlen(str)中添加+1来解释空字符,这就行了?
向strlen(str)中添加+1来解释空字符
-Yeshow每次我测试它时都会出现没有垃圾显示?只是幸运?你用的是哪种编译器?我收到垃圾
了↑─瓦拉ⁿ┼wç0@hello
revStr[strlen(str)]=0
相当于
revStr[strlen(str)]='\0'
int a[] = {1,2,3};
int c = 0;
int *b  = &c;

a = b;//error