亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 一種危險的內(nèi)存使用方法~ [打印本頁]

作者: cmh_2003    時間: 2006-09-26 16:09
標題: 一種危險的內(nèi)存使用方法~

  1. #include<stdio.h>
  2. main()
  3. {
  4. char *p;
  5. p = (char *)malloc(10);
  6. p = p +5;
  7. free(p);
  8. }
復(fù)制代碼

這樣的錯犯了不是一次了,不知道大家犯沒犯過這種錯誤.帖出來給自己加深一下印象 T_T
作者: flw    時間: 2006-09-26 16:20
支持自爆!
作者: cmh_2003    時間: 2006-09-26 16:25
原帖由 flw 于 2006-9-26 16:20 發(fā)表
支持自爆!

建議老大隔離清茶觀察一段時間,最近反映讓我害怕
作者: 飛灰橙    時間: 2006-09-26 16:45
再給樓主奉獻一個可能出錯的代碼玩玩:

  1. typedef struct
  2. {
  3.     char buf[1024*1024];
  4. } MY_STRUCT_T;

  5. void fun (MY_STRUCT_T foo)
  6. {
  7.    ....
  8. }
復(fù)制代碼

作者: ivhb    時間: 2006-09-26 17:00
標題: 回復(fù) 4樓 飛灰橙 的帖子
什么問題? 說說看 ?
作者: seeLnd    時間: 2006-09-26 17:06
呵呵,LZ那是錯誤,飛灰橙的才叫危險
作者: kuaizaifeng    時間: 2006-09-26 17:19
佩服自爆的勇氣
剛犯了一個錯誤
感覺丟死人了
作者: langue    時間: 2006-09-26 19:13
呵呵,用臨時變量就沒這個問題了。
作者: langue    時間: 2006-09-26 19:14
原帖由 飛灰橙 于 2006-9-26 16:45 發(fā)表
再給樓主奉獻一個可能出錯的代碼玩玩:

  1. typedef struct
  2. {
  3.     char buf[1024*1024];
  4. } MY_STRUCT_T;

  5. void fun (MY_STRUCT_T foo)
  6. {
  7.    ....
  8. }
復(fù)制代碼


你編譯的時候用了什么選項?好厲害啊,竟然能寫出這個來……
作者: neo_yang    時間: 2006-09-26 20:05
lanque你在線,能給解釋下為什么很危險嗎?
作者: dlms    時間: 2006-09-26 20:13
原帖由 飛灰橙 于 2006-9-26 16:45 發(fā)表
再給樓主奉獻一個可能出錯的代碼玩玩:

  1. typedef struct
  2. {
  3.     char buf[1024*1024];
  4. } MY_STRUCT_T;

  5. void fun (MY_STRUCT_T foo)
  6. {
  7.    ....
  8. }
復(fù)制代碼

這個沒看懂!

作者: langue    時間: 2006-09-26 20:16
原帖由 neo_yang 于 2006-9-26 20:05 發(fā)表
lanque你在線,能給解釋下為什么很危險嗎?


1024*1024是多少字節(jié)
作者: neo_yang    時間: 2006-09-26 20:25
以傳值的方式傳遞1M字節(jié)給一個臨時變量,你的意思是棧空間可能會把堆空間的值覆蓋?
作者: safedead    時間: 2006-09-26 21:05
原帖由 飛灰橙 于 2006-9-26 16:45 發(fā)表
再給樓主奉獻一個可能出錯的代碼玩玩:

  1. typedef struct
  2. {
  3.     char buf[1024*1024];
  4. } MY_STRUCT_T;

  5. void fun (MY_STRUCT_T foo)
  6. {
  7.    ....
  8. }
復(fù)制代碼


我以前寫過這樣的代碼:
static int fun(char para[1024])
{
......
}
不會鬧問題
但也寫過:
struct {
......
} a;
static int fun(struct a[1000])
{
......
}
結(jié)果程序變得很怪異
后來我就記住對結(jié)構(gòu)只傳指針
作者: neo_yang    時間: 2006-09-26 21:08
能不能把這個問題在計算機內(nèi)部各個空間的描述深入些?一般在32位機上的?臻g為多大,等等
作者: lrobin    時間: 2006-09-27 00:21
標題: 32位機上的?臻g 是 4M
32位機上的?臻g 是 4M  
下面這個沒看明白,解釋一下吧

typedef struct
{
    char buf[1024*1024];
} MY_STRUCT_T;

void fun (MY_STRUCT_T foo)
{
   ....
}
作者: nully    時間: 2006-09-27 00:36
#include <stdio.h>

static long init_stack;

int func() {
        long i;
        printf("%x\n", init_stack - (long)(&i));
        func();
}

int main() {
        long i;
        init_stack = (long)(&i);
        func();
}

自己檢查一下系統(tǒng)能給多大的棧,我的大約是8M
作者: 飛灰橙    時間: 2006-09-27 09:18
原帖由 safedead 于 2006-9-26 21:05 發(fā)表


我以前寫過這樣的代碼:
static int fun(char para[1024])
{
......
}
不會鬧問題
但也寫過:
struct {
......
} a;
static int fun(struct a[1000])
{
......
}
結(jié)果程序變得很怪異
后來我就記住對結(jié)構(gòu)只傳指針


錯了吧,原先也是傳的指針阿
作者: slay78    時間: 2006-09-27 09:49
static int fun(char para[1024])
當(dāng)然沒有問題,那個1024寫跟不寫好像沒什么區(qū)別
作者: 蝸大牛牛    時間: 2006-09-27 16:23
標題: 回復(fù) 4樓 飛灰橙 的帖子
請問這個為什么很危險啊,我怎么感覺我這半年來一直在這樣用啊,5555555拜托了
typedef struct
{
    char buf[1024*1024];
} MY_STRUCT_T;

void fun (MY_STRUCT_T foo)
{
   ....
}
作者: GongWithTheWind    時間: 2006-09-27 16:29
原帖由 蝸大牛牛 于 2006-9-27 16:23 發(fā)表
請問這個為什么很危險啊,我怎么感覺我這半年來一直在這樣用啊,5555555拜托了
typedef struct
{
    char buf[1024*1024];
} MY_STRUCT_T;

void fun (MY_STRUCT_T foo)
{
   ....
}




作者: isnowran    時間: 2006-09-27 17:11
沒什么危險的,最多你要保證結(jié)構(gòu)的size要小于(棧size/2)
純屬個人理解
作者: 醉臥水云間    時間: 2006-09-27 17:15
原帖由 flw 于 2006-9-26 16:20 發(fā)表
支持自爆!


這哪是自爆,簡直就是自宮嘛。
作者: bzimage    時間: 2006-09-27 17:28
原帖由 蝸大牛牛 于 2006-9-27 16:23 發(fā)表
請問這個為什么很危險啊,我怎么感覺我這半年來一直在這樣用啊,5555555拜托了
typedef struct
{
    char buf[1024*1024];
} MY_STRUCT_T;

void fun (MY_STRUCT_T foo)
{
   ....
}



我覺得這算不上危險,所有開的緩沖區(qū)小于棧就沒事
當(dāng)然這種寫法的效率會低一些
作者: 飛灰橙    時間: 2006-09-27 17:32
原帖由 bzimage 于 2006-9-27 17:28 發(fā)表



我覺得這算不上危險,所有開的緩沖區(qū)小于棧就沒事
當(dāng)然這種寫法的效率會低一些


如果fun是個遞歸函數(shù)呢,
你希望fun能遞歸多少層?
作者: hellhell    時間: 2006-09-27 17:44
以前一個同學(xué),寫個程序,用全局變量就不崩潰,放進局部就掛了.
一個年年拿一等獎金的家伙居然沒想明白這是怎么回事,操
作者: isnowran    時間: 2006-09-27 17:44
原帖由 飛灰橙 于 2006-9-27 17:32 發(fā)表


如果fun是個遞歸函數(shù)呢,
你希望fun能遞歸多少層?

有道理,不過,函數(shù)這樣寫的可能性不大,也就能在教科書里見到了
話又說回來了,遞歸多了不論怎樣都會失敗,指針占4個字節(jié),如果你傳的結(jié)構(gòu)是這個樣子

  1. struct test
  2. {
  3.         char str[2];
  4. };
復(fù)制代碼

那豈不是比傳指針還能多活一會,哈哈
作者: 飛灰橙    時間: 2006-09-27 17:58
原帖由 isnowran 于 2006-9-27 17:44 發(fā)表

那豈不是比傳指針還能多活一會,哈哈


那你錯了,大多數(shù)時候為了效率,為了對齊,
即使一個char的參數(shù),compiler也會花掉一個int的?臻g
作者: langue    時間: 2006-09-27 18:31
原帖由 飛灰橙 于 2006-9-27 17:58 發(fā)表


那你錯了,大多數(shù)時候為了效率,為了對齊,
即使一個char的參數(shù),compiler也會花掉一個int的?臻g


這就說到點上了。這些都是編譯器在編譯的時候給分配的,而指針+heap的分配方式就用不著編譯器操心了。

遞歸時絕對不要直接在棧上分配。是習(xí)慣問題。

另外,char的實際占用大小還要看cpu。cpu是8位的,那么沒有區(qū)別。
作者: direstrait    時間: 2006-09-27 21:31
標題: 形參傳的是結(jié)構(gòu),而不是指針
可能導(dǎo)致棧溢出, 一般線程的棧大小默認為1M。
作者: bzimage    時間: 2006-09-28 13:27
原帖由 飛灰橙 于 2006-9-27 17:32 發(fā)表


如果fun是個遞歸函數(shù)呢,
你希望fun能遞歸多少層?



即使一個遞歸函數(shù)不帶任何參數(shù),他能遞歸的層數(shù)也是有限的,這是遞歸實現(xiàn)的問題,與遞歸函數(shù)帶有什么樣的參數(shù)是沒有關(guān)系的。

我說的所有開的緩沖區(qū)要小于棧大小,這里所有的緩沖區(qū)當(dāng)然包括在運行時,每次調(diào)用這個遞歸函數(shù)所開的緩沖區(qū)的大小了,而不是從源文件中看到函數(shù)中定義的大小。
作者: 飛灰橙    時間: 2006-09-28 13:57
原帖由 bzimage 于 2006-9-28 13:27 發(fā)表


即使一個遞歸函數(shù)不帶任何參數(shù),他能遞歸的層數(shù)也是有限的,這是遞歸實現(xiàn)的問題,與遞歸函數(shù)帶有什么樣的參數(shù)是沒有關(guān)系的。

我說的所有開的緩沖區(qū)要小于棧大小,這里所有的緩沖區(qū)當(dāng)然包括在運行時,每次調(diào)用這個遞歸函數(shù)所開的緩沖區(qū)的大小了,而不是從源文件中看到函數(shù)中定義的大小。


那么請問你的程序“開的緩沖區(qū)”大小有多少個bytes?
你能算出來嗎?請給出計算方法。
作者: 飛灰橙    時間: 2006-09-28 13:59
:em11::em11:
作者: loveenic    時間: 2006-09-28 14:45
看不出有什么危險!
作者: Benson_linux    時間: 2006-09-28 16:30
請教大家,你們的這些內(nèi)存分配的知識是從哪里學(xué)到的。
作者: E-baby    時間: 2006-09-29 08:11
都瘋了,都要玩自爆??呵呵呵
作者: Benson_linux    時間: 2006-09-29 10:18
關(guān)于進程的地址空間的知識,可以給大家推薦一本書,《深入理解Linux虛擬內(nèi)存管理》第四章,比較詳細。
作者: liubingqian    時間: 2006-09-29 11:12
截至目前,我還從沒寫過像樓主這樣的代碼。
作者: 思一克    時間: 2006-09-29 11:47
我覺得LZ的問題是一個程序錯誤,應(yīng)該不屬于內(nèi)存使用的方法(之一)。因為壓根就不應(yīng)該這樣。只是不小心犯了錯誤
作者: SeaKing911    時間: 2006-09-29 12:26
頂一下
作者: snow2sun    時間: 2006-09-30 17:12
原帖由 Benson_linux 于 2006-9-28 16:30 發(fā)表
請教大家,你們的這些內(nèi)存分配的知識是從哪里學(xué)到的。

部分在<微機原理>,部分在<操作系統(tǒng)>學(xué)的
作者: snow2sun    時間: 2006-09-30 17:13
原帖由 cmh_2003 于 2006-9-26 16:09 發(fā)表

  1. #include<stdio.h>
  2. main()
  3. {
  4. char *p;
  5. p = (char *)malloc(10);
  6. p = p +5;
  7. free(p);
  8. }
復(fù)制代碼

這樣的錯犯了不是一次了,不知道大家犯沒犯過這種錯誤.帖出來給自己加深一下印象 T_T

貌似應(yīng)該*p=*p+5?
作者: langue    時間: 2006-09-30 17:15
原帖由 snow2sun 于 2006-9-30 17:13 發(fā)表

貌似應(yīng)該*p=*p+5?


他想說的是,將指針p偏移5個字節(jié),然后“釋放”空間……




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2