c语言之创建字符串的两种方式

在c语言中,一般有两种方式来创建字符串

//第一种,利用字符指针
char* p = "hello";
//第二种:利用字符数组
char str[] = "hello";

那么,它们之间有什么区别呢?以例子说明:

#include<stdio.h>
#include<iostream>
char* returnStr()
{
    char* p = "hello world!";
    return p;
}
int main()
{
    char* str = NULL;
    str = returnStr();
    printf("%s\n", str);
    system("pause");
    return 0;
}

输出:

以上代码是没有问题的,"hello world"是一个字符串常量,存储在常量区,p指针指向该常量的首字符的地址,当returnStr函数退出时,常量区中仍然存在该常量,因此仍然可以用指针访问到。

#include<stdio.h>
#include<iostream>
char* returnStr()
{
    char p[] = "hello world!";
    return p;
}
int main()
{
    char* str = NULL;
    str = returnStr();
    printf("%s\n", str);
    system("pause");
    return 0;
}

输出:

以上代码有问题,输出为乱码。这一段代码和之前的最主要的区别就是returnStr中字符串的定义不同。这里使用字符数组定义字符串。因此这里的字符串并不是一个字符串常量,该字符串为局部变量,存查在栈中,当returnStr函数退出时,该字符串就被释放了,因此再利用指针进行访问时就会访问不到,输出一堆乱码。

当然 ,如果将char p[] = "hello world!";声明为全局变量,即:

#include<stdio.h>
#include<iostream>
char p[] = "hello world!";
char* returnStr()
{
    return p;
}
int main()
{
    char* str = NULL;
    str = returnStr();
    printf("%s\n", str);
    system("pause");
    return 0;
}

那么,该字符串就会存储在全局变量区,一般将全局变量区和静态资源区和常量区视为一个内存空间。因此,同样可以使用指针访问到。

输出:

原文地址:https://www.cnblogs.com/xiximayou/p/12129140.html

时间: 2024-08-05 02:14:16

c语言之创建字符串的两种方式的相关文章

JAVA中创建字符串的两种方式的区别

我们知道,通常在Java中创建一个字符串会有两种方式,通过双引号直接赋值和通过构造器来创建. String x = "abcd"; String y = new String("abcd"); 然而,这两种方式之间的区别是什么?分别应用于哪些情况,之前还不是很懂. 1.双引号的方式 String x = "abcd"; String y = "abcd"; System.out.println(x==y);//true Sys

C语言中存储多个字符串的两种方式

C语言中存储多个字符串的两种方式 方式一    二维字符串数组 声明: char name[4][10] = { "Justinian", "Momo", "Becky", "Bush" }; 在内存中的存储: J u s t i n i a n \0 M o m o \0 \0 \0 \0 \0 \0 B e c k y \0 \0 \0 \0 \0 B u s h \0 \0 \0 \0 \0 \0 这种方式会造成内存空间

创建TabHost的两种方式的简单分析

最近做了一个TabHost的界面,在做的过程中发现了一些问题,故和大家分享一下. 首先我的界面如下: 目前就我所知,创建TabHost有两种方式,第一种是继承TabActivity类,然后用getTabHost方法来得到一个TabHost的实例,然后就可以给这个TabHost添加Tab了.示例代码如下: [java] view plaincopy public class PlotHost extends TabActivity  { @Override protected void onCre

创建线程的两种方式比较Thread VS Runnable

1.首先来说说创建线程的两种方式 一种方式是继承Thread类,并重写run()方法 1 public class MyThread extends Thread{ 2 @Override 3 public void run() { 4 // TODO Auto-generated method stub 5 6 } 7 } 8 //线程使用 9 MyThread mt = new MyThread(); //创建线程 10 mt.start(); //启动线程 另外一种方式是实现Runnabl

黑马程序员——创建线程的两种方式

java中创建线程有两种方式: 1.继承Thread类 步骤: (1)定义一个类继承Thread类 (2)复写Thread类中的run()方法 (3)调用start()方法:启动线程及调用run()方法 2.实现Runnable接口的方式 步骤:(1)定义一个类实现Runnable接口 (2)覆盖Runnable接口中的run()方法,将线程要运行的代码放到该run方法中 (3)通过Thread类建立线程对象 (4)将实现Runable接口的类对象作为实际参数传递给Thread的构造函数. (5

Java并发编程-创建线程的两种方式及区别

转载请注明:http://blog.csdn.net/UniKylin/article/details/45016117 1.线程和进程的区别 并行:是多个任务在同一时间同时执行,例如多核计算机同时计算的任务可以理解为并行 并发:从微观上看是多个任务抢占一个CPU从而执行自己的任务,轮流执行任务,但是如果遇到资源冲突的时候并没有从根本提高执行效率.但是提高了CPU的使用效率. 前段时间在GitHub上的一幅图可以很好的阐述上面的概念非常形象 2.Java中创建线程的两种方式 1.第一种方式:直接

OC--定义字符串的两种方式

1.常量区 存放一些常量字符串2.堆 对象3.栈 存放局部变量 掌握:1.定义字符串的两种方式 1>利用数组 char name[] = "itcast"; 特点:字符串里面的字符是可以修改的 2>利用指针 char *name = "itcast"; 特点:字符串其实是一个常量字符串,里面的字符是不能修改的

【java并发】传统线程技术中创建线程的两种方式

传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式大部分人可能都知道,但是为什么这样玩就可以呢?下面我们来详细分析一下这两种方法的来龙去脉. 1. 揭秘Thread中run()方法 上面我们看到这两种方式都跟run()方法有关,所以我们来看一下Thread的源码中run()方法到底都干了什么: @Override public void run()

定义字符串的两种方式

定义字符串的两种方式 数组定义 char name[] = "answer" 指针定义 char *name = "answer" 比较 字符串里的字符可以修改,而字符串是一个常量,字符串里面的字符不能修改. >Tips:可以与我的另外一篇文章一起看.http://blog.csdn.net/u011192270/article/details/46475981 版权声明:本文为博主原创文章,未经博主允许不得转载.