首页 > 试题广场 >

有以下一段代码char*fun(){chara[]="hel

[单选题]

有以下一段代码

#include <stdio.h>
char* fun() {
    char a[] = "hello world";
    return a + 6;
}
int main() {
    printf("%s", fun());
    return 0;
}

请问程序最后输出结果是()

  • world
  • hello world
  • 结果未知或者程序崩溃
  • 程序崩溃
因为这里a指的是栈上的存储区,申请的内存在函数结束的时候就会被收回,因此不能返回。
而 char* p = "hello world"就可以!!!,因为这里指的是常量内存区。
发表于 2018-06-21 23:01:48 回复(2)
#include <stdio.h>
char* fun() {
    char *a = "hello world";
    return a + 6;
}
int main() {
    printf("%s", fun());
    return 0;
}

运行结果:

world
发表于 2022-06-28 21:53:04 回复(3)
字符串在常量区一旦赋值给数组就属于栈空间,此时a+6是可以的但是返回的时候是会关闭栈空间的,如果你打印出来可以再试试返回后加个sleep(1)一般就可以看到正确的结果
发表于 2023-02-09 00:11:30 回复(0)
1,字符串存储在静态存储区。2,fun函数开始运行后,才会为数组a分配内存,并将字符串 拷贝 到数组中(此时字符串有两个副本), 函数退出后,释放内存,原本a所指的数组空间被释放,返回的指针不指向w了。
发表于 2023-10-24 10:40:50 回复(0)
数组是在栈上创建的,还来不及返回就还给操作系统了
发表于 2021-10-16 16:34:25 回复(0)
改成static  char *a = "hello world"; 应该就可以了
发表于 2023-06-11 14:20:55 回复(0)
数组a具有自动存储期限,C语言中函数不能返回具有自动存储期限的指针,因为具有自动存储期限的变量在其作用域结束后就不存在了,进行操作会导致未定义的行为。
发表于 2022-03-21 11:19:52 回复(0)

  1. 悬挂指针(Dangling Pointer): 函数fun()中声明了一个局部数组a,并返回该数组的第七个元素(即指向字符串 "world" 的指针)。然而,当函数返回时,局部数组a的生存周期结束,它所占用的内存被释放,因此返回的指针指向的内存区域已经无效,这会导致悬挂指针问题。当main()函数尝试使用这个指针打印字符串时,会导致未定义的行为。

  2. 未在函数外部声明字符串数组: 在函数fun()中,字符数组a是在栈上声明的,它的生命周期仅限于函数的执行期间。在函数返回后,它的内存空间将被释放,因此返回的指针将指向无效的内存。

要解决这些问题,可以考虑将字符串数组声明为静态(static)或者动态分配内存(使用malloc()函数),以确保它在函数返回后仍然有效。
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>
 
char* fun() {
    static char a[] = "hello world"; // 使用静态数组
    return a + 6;
}
 
int main() {
    printf("%s", fun());
    return 0;
}
或者使用动态内存分配:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
 
char* fun() {
    char* a = (char*)malloc(12 * sizeof(char)); // 使用动态内存分配
    if (a == NULL) {
        printf("内存分配失败");
        exit(1);
    }
    strcpy(a, "hello world");
    return a + 6;
}
 
int main() {
    char* result = fun();
    printf("%s", result);
    free(result); // 释放动态分配的内存
    return 0;
}
发表于 2024-04-01 15:26:59 回复(0)
a为栈区,不是有malloc开辟的动态的内存。在堆上可以临时保存

发表于 2022-11-15 22:21:01 回复(0)
数组是在栈上创建的,还来不及返回就还给操作系统了
发表于 2021-12-03 09:21:53 回复(0)