1. 程式人生 > >C++ 字串取值,取址,引用 例題

C++ 字串取值,取址,引用 例題

有如下程式段:

void GetMemeory(char *p)
{
    p = (char *)malloc(100);
}
void Test()
{
    char *str = NULL;
    GetMemeory(str);
    strcpy(str, "Thunder");
    strcat(str + 2, "Downloader");
    printf(str);
}

請問執行Test函式結果是:

A Thunder Downloader

B under Downloader

C Thunderownloader

D 程式崩潰

str為一個指標,但實際上為int型別,傳入函式內部並不會發生任何改變(str是一個指標,在32位的機器上,它是一個32位的整數,儲存一個記憶體地址的值)
GetMemory函式執行完成後,str仍然指向NULL,所以賦值時回奔潰
正確的做法應該使用雙指標 或使用引用

按值傳遞,函式返回後,區域性變數的值不會隨著呼叫函式內部的實現—-改變而=改變。
按地址傳遞和按指標傳遞,才會改變區域性變數的值。
這道題,GetMemory()是按照按值傳遞的,因而區域性變數,不會因為函式內部 p = (char*)malloc(100);
的實現,而更改。返回主函式後, 仍然是 *str = NULL;。因而在改指標執行操作,會造成程式崩潰。
因為沒有為它分配記憶體。

雙指標方法:

連結:https://www.nowcoder.com/questionTerminal/681153b22f4d4622a7bf63cb6670aa23
來源:牛客網

void GetMemory(char
**p){ *p = (char *)malloc(100); } void Test(){ char *str = NULL; GetMemory(&str); strcpy(str,"Thunder"); strcat(str+2,"Downloader"); printf(str); }

引用方法:

void GetMemeory(char* &p)
{
    p = (char *)malloc(100);
}
void Test()
{
    char *str = NULL;
    GetMemeory(str
); strcpy(str, "Thunder"); strcat(str + 2, "Downloader"); printf(str); }

strcat用於將兩個char型別連結的函式。
函式原型:extern char *strcat(char *dest,char *src);
引數:
dest 目標陣列指標
src 源字串指標
返回值:返回指向dest的指標
函式功能:把src所指字串新增到dest結尾處(覆蓋dest結尾處的’\0’)並新增’\0’。

printf(str);

執行結果:

ThunderDownloader

若最後列印資訊為:

printf(str+2)

執行結果:

underDownloader

cout物件認為char的地址是字串的地址,因此一直輸出知道遇到空字元結束。

相關推薦

typeof 的類型範圍以及typeof和instanceof的區別

typeof的取值範圍: 以上一共6種取值範圍(number,string,object,function,boolean,undefind),分別對應。 instanceof: 要求前面是個物件,後面是個建構函式,而且返回的是布林值,必須是true或fal

C++入門筆記】傳、傳引用

預設情況下,引數只能以值傳遞的方式給函式。 這句話的理解是,被傳遞到函式的只是變數的值,永遠不會是變數本身。 下面來看一段示例程式碼: #include <iostream> void changeAge( int age, int newAge ); main(

sql語句 集合之間的重疊 區間比較 薪資範圍

SQL語句 篩選出符合薪資範圍的簡歷 假如打比我是HR 我要從求職者的簡歷中篩選出符合我要求範圍的求職者 這是我收到的所有求職簡歷(start為最低薪資,end為最高薪資) 我的需求 我要從

C++中賦操作符為什麼要返回引用型別

class Test {     Test& operator= (const Test& t)            {           } } 這個是我們熟悉的賦值操作符函式的格式,但是該函式為什麼非得要返回一個引用呢。 查閱了很多資料感覺這種解釋比

C++ 字串引用 例題

有如下程式段: void GetMemeory(char *p) { p = (char *)malloc(100); } void Test() { char *str = NULL; GetMemeory(str); s

c語言==字元陣列與字串char的範圍(1)

求char型別陣列的strlen長度 昨天老師給了一道題目 #include <stdio.h> #include "string.h" int main() { int i; char a[1000]; fo

將R[n]中的每個字元按照字母字元、數字字元和其他字元的順序排列。要求利用原有空間。 輸入輸出樣例:1組 #1 樣例輸入: 7 //n的表示字元陣列中包括有多大 a b 1 2 c ] d

將R[n]中的每個字元按照字母字元、數字字元和其他字元的順序排列。要求,利用原有空間,且各類字元順序也不改變。 輸入輸出樣例:1組 #1 樣例輸入: 7 //n的取值,表示字元陣列中包括有多大 a b 1 2 c ] d //7個字元元素都是什麼 樣例輸出:

SQL根據字串型別欄位進行排序可以在的時候處理

 DataTable dt = DB.ExecuteDataTable(sql.ToString(), CommandType.Text, null);//資料來源             dt.Columns.Add("status", Type.GetType("Sys

setlocale(LC_ALL, ""); 為空字串" "(注意不是NULL)則locale與本地環境所使用的編碼方式相同(在本地化時應該很有用);

在C執行庫提供的多位元組字元-寬字元轉換函式:mbstowcs()/wcstombs()中,需要用到全域性變數locale( locale encoding ),以指定多位元組字元的編碼型別 1. 功能: 用來定義全域性變數:locale(locale encoding) 標頭檔案: setlocal

C語言中int型資料的範圍?

在C語言中,int型資料所佔的位元組和具體的編譯器有關,32位編譯器int佔4個位元組(VC,C-free),16位編譯器int佔2個位元組(詳見“int型資料所佔位元組和什麼有關”)。 以兩個位元組為例: 在C中,int型資料是一個有符號的整型資料,其最高位為符號位(0表

C#List轉字串字串轉List字元陣列轉Int陣列字串轉string某一位置字元等

List轉字串 [C#] 純文字檢視 複製程式碼 01 02 List<string> List = new List<string>(); string strArray = string.Join(",", List

C++程式碼片段(一)萃函式返回型別引數型別引數個數

函式的型別主要集中在以下幾種 函式指標 函式物件,是一個類物件,內部過載的operator()函式是一個函式指標 lambda,匿名函式物件,同函式物件 function物件 後三者都是類物件,可以看成一種型別 定義基礎模板類 t

jquery操作select(設置選中)

tle 當前 一個 true replace 引號 邏輯 func itl 比如<select class="selector"></select> 1、設置value為pxx的項選中 $(".selector").val("pxx");

python 嵌套字典比較

ima () pie port highlight odi pes brush logs #取值import types allGuests = {‘Alice‘: {‘apples‘: 5, ‘pretzels‘: {‘12‘:{‘beijing‘:456}}},

在0~N個數字中指定個數的不重復數字要求這些數字的和為指定求所有結果

readline tco write span count string rgs logs index 1 using System; 2 using System.Collections.Generic; 3 using System.Linq;

48.reduce排序去重最大

prev col function red logs ngui ras value ber var arr = [2,4,1,-1,9] //取最大值 var maxValue = arr.reduce(function(a,b){ return a>

python 字典合並字典列表轉字典

就是 nbsp 2.7 fault font ... 3.5 bsp 轉化 1、字典的合並 # 第一種 用Python的內置方法,dict與**解包的方式 >>> a = {‘name‘:1,‘b‘:2} >>> b = {‘name‘

django 數據庫的一對多多對一

多對一 行記錄 對象 分享圖片 Go 技術 記錄 inf 一對多 一對多 是一行記錄的對象,然後點外鍵,就可以點到多的那張表的屬性了。 django 數據庫的一對多,多對一取值

python練習題寫一個方法 傳進去列表和預期的value 求出所有變量得可能性(例如list為[1,2,3,4,5,6,12,19]value為20結果是19+1==20只有一種可能性)要求時間復雜度為O(n)

num bubuko com pri def 代碼 data- 取值 .com 題目:(來自光榮之路老師)a+b==valuea+b+c=valuea+b+c+d==valuea+b+c+d+...=valuea和b....取值範圍都在0-value寫一個方法 傳進去列

py呼叫oracle的儲存過程注意procedure的out方式

#!/usr/bin/env python import sys import csv import cx_Oracle import codecs import os os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.ZHS16GBK'