同一條陳述句中都多次呼叫同一個回傳值為char*型別的函式的時候,出來的結果不對,比如說
主程式陳述句
printf("[%s%s]",fun(p1),fun(p2));
函式
char* fun(p);
主程式執行結果為
[值1值1]
這是因為什么
uj5u.com熱心網友回復:
你把代碼貼全了要知道fun是怎么回傳結果的才能幫你分析
uj5u.com熱心網友回復:

uj5u.com熱心網友回復:
不知道。不過如果是水平不到位的程式容易犯的一個錯誤是回傳區域變數地址。這種是不安全不正確的
uj5u.com熱心網友回復:
你的代碼呢?從你的描述來看,看不出為什么的。fun函式回傳的是什么地址,區域變數地址,還是全域變數地址以及靜態變數等等這些不清楚呢uj5u.com熱心網友回復:
頭檔案定義回傳的資料
char rtn[1024];
下面是外部函式邏輯
char* fun(char* p){
char* lptr ;
下面邏輯省略寫了哈
malloc開辟lptr的空間
一系列操作
把lptr賦值給頭檔案里的rtn
free掉lptr
return rtn;
}
邏輯大致這樣
uj5u.com熱心網友回復:
頭檔案定義回傳的資料
char rtn[1024];
下面是外部函式邏輯
char* fun(char* p){
char* lptr ;
下面邏輯省略寫了哈
malloc開辟lptr的空間
一系列操作
把lptr賦值給頭檔案里的rtn
free掉lptr
return rtn;
}
邏輯大致這樣
uj5u.com熱心網友回復:
我是樓主,因為專案資訊安全原因不能貼代碼,只能大致說一說不好意思哈(T ^ T)uj5u.com熱心網友回復:
回傳了個野指標
uj5u.com熱心網友回復:
printf(,f(1),f(2));f(1),f(2) 先于printf();
f(1),f(2)兩個
形式一樣的函式連續呼叫,第一個malloc【比如結構體A大小的資料1】后free掉它。緊跟著第二個函式一模一樣的函式呼叫,再次malloc【由于背景關系、以及環境幾無變化,因此我認為】作業系統極有可能就又把你釋放的那一塊拿來給你用【比如你在這里創建了一個結構體A大小的資料2】,后再free掉它。
------------------------此時f(1),f(2)回傳的都是野指標,但都指向了第二個執行的【f(1)或者f(2)之一】f()函式處理后的資料:資料2
緊跟著printf(,資料2的指標【野指標,危險】,資料2的指標【野指標,危險】)
uj5u.com熱心網友回復:
樓主的是回傳全域變數,如果不一致,那么看一下最后修改的是那個?
uj5u.com熱心網友回復:
你的代碼呢?從你的描述來看,看不出為什么的。fun函式回傳的是什么地址,區域變數地址,還是全域變數地址以及靜態變數等等這些不清楚呢
頭檔案定義回傳的資料
char rtn[1024];
下面是外部函式邏輯
char* fun(char* p){
char* lptr ;
下面邏輯省略寫了哈
malloc開辟lptr的空間
一系列操作
把lptr賦值給頭檔案里的rtn
free掉lptr
return rtn;
}
邏輯大致這樣
沒看到引數p做了什么?那么這個引數有啥意義呢?
uj5u.com熱心網友回復:
你的代碼呢?從你的描述來看,看不出為什么的。fun函式回傳的是什么地址,區域變數地址,還是全域變數地址以及靜態變數等等這些不清楚呢
頭檔案定義回傳的資料
char rtn[1024];
下面是外部函式邏輯
char* fun(char* p){
char* lptr ;
下面邏輯省略寫了哈
malloc開辟lptr的空間
一系列操作
把lptr賦值給頭檔案里的rtn
free掉lptr
return rtn;
}
邏輯大致這樣
沒看到引數p做了什么?那么這個引數有啥意義呢?
在一系列操作里
uj5u.com熱心網友回復:
把lptr賦值給頭檔案里的rtn。這句話如果使用memcpy或者sprintf的話,應該是沒有問題的。
可以在free掉lptr 只有加一句列印。 列印一下此時的rtn。看看問題出在哪里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/14257.html
標籤:C語言
上一篇:完善程式求助
下一篇:迷茫了 求大佬指點下
