C語言memcpy的一些問題,C語言memcpy的問題

2022-03-09 00:05:08 字數 3228 閱讀 9754

1樓:糖二灰

可能錯在了計算機儲存機制上,

在32位系統的計算機中,每次變數的儲存都是按以4的倍數字置開始的位址來儲存的,

也就是說你新建乙個變數,不管它是什麼型別的,他都是從4的倍數字開始的。

雖然你這麼儲存是確實把內部東西都儲存進去了,但是根據計算機的編碼顯示原因,

你直接看編譯後產生的那些東西就是亂碼的,或者不符合你要求的。

你可以對照原始儲存進去的二進位制碼與原來的對比,應該是相同的。

而且int x=10; 這裡的int應該是4個位元組,writedata(&x,2);應該是writedata(&x,4);

2樓:匿名使用者

雖然不少書說int和char是相通的但實際上現在的形式是int是佔四個位元組,而char是佔1個位元組。memcpy是字串處理函式。所以你這樣直接用int的位址是錯誤的,int和char不是不可以通用。

只是一般很容易搞錯。一般通用的值恐怕只有0這個值了。因為0這個值,int四個位元組,四個字解32位都是0值就是0,而char乙個位元組8為都是0才會是0,那麼char和int的就能行了。

但是即使是0很多人都會搞錯。

x是int型的,你要先把x的數值10轉換為字串「10」,所以寫乙個增加乙個字元陣列xx用來儲存x的值轉換為的字串,所以writelnint要改。寫法如下()

void writelnint(int i)同時,我writedata也要改

void writedata(char *data,int len)因為傳遞過來的len的長度是要複製的字元的個數,這包含了乙個結束標誌,所以加的時候要減1,而且這要下一次連線之是就剛好是從結束標誌所在的位置開始(或者說下一次執行是的newpos就是這個結束標誌的位置)

完整的**在附件裡

這是執行結果

3樓:匿名使用者

你是如何看到資料沒有被追加到m_pdata裡的?

按你第二種意思的話, int型資料要轉為string型寫入才能有10abcd這種效果:

void writeint(int i)

;sprintf(tmp, "%d", i);

writedata(tmp,strlen(tmp));//如果你是按字串看m_pdata的,這裡就不是strlen(tmp)+1,否則要+1

}writestring也取決於你是按字串方式看的還是按記憶體長度直接單個字元打出來的。相應應該沒有「+1」和有「+1」

4樓:匿名使用者

void writedata(void *data,int len)上面這個函式只是為了能過多次呼叫writedata來把一些資料寫到m_pdata裡

比如這樣:

int x=10;

writedata(&x,2);

char *str="abcd";

writedata(str,5);

c語言memcpy的問題

5樓:夜禮服假面

你要搞清楚memcpy()函式的第三個引數意思第三個引數是大小,不是個數

按你的要求應該是memcpy(a, b, sizeof(int)*2);

你試試吧

6樓:

memcpy(a, b, 2 * sizeof(int) );

關於c語言 memcpy的問題

7樓:老猿

兩個問題:

1、readfile引數用整數指標並不能將分配的記憶體位址帶出該函式,應該用指標的指標才能帶出;

2、沒有地方等程式執行完,否則除非在命令列狀態,否則看不到資料。

修改如下:

void readfile(int **pa);*pa = (int*)calloc(3, sizeof(int));

memcpy(*pa, a, 3*sizeof(int));

}void main()

8樓:江湖三腳貓

兩種該法。

1.使用指標的指標:

void readfile(int **pa);*pa = (int*)calloc(3, sizeof(int));

memcpy(*pa, a, 3*sizeof(int));

}void main()

2.在主函式中分配空間(可以理解成使用陣列)void readfile(int *pa);memcpy(pa, a, 3*sizeof(int));

}void main()

關於c語言陣列的memcpy的乙個問題 10

9樓:

你這**編譯都不會過,怎麼還會有輸出?s、a、b在**?又,memcpy是按位元組數拷貝的,你寫的memcpy(q+1,b+12,4);拷貝位元組數是4,拷貝到q+1起的4個位元組上,並沒有越界,若原來有'\0',那'\0'還在;若原來沒有,拷貝後還是沒有。

求助!c語言裡面的memcpy函式的用法

10樓:匿名使用者

pascal語言不會

不過意思就是把b陣列裡面的長度為b陣列大小的資料複製到a陣列裡面去實際效果應該等同於下面的**

void * memcpy(void * destination, const void * source, size_t num)

return destination;}

c語言中有關memcpy函式的問題

11樓:鬼火狼煙

由於d是char型別,如果按lz的寫法d[strlen(s)]='\0';是完全可以的,也是比較正規的寫法,而d[strlen(s)]=0是把0做了(char)隱式轉換後賦值給d,本質上沒有什麼不同('\0'的ascii碼值就是0),但是這樣的寫法很晦澀,不應該提倡.

12樓:

字串*s是以結束符'\0'為結束的,而strlen為字串的長度,但是不包括結束符。而printf函式中需要結束符,因此需要用d[strlen(s)]='\0』。可以在使用memcpy(d,s,strlen(s)+1).

13樓:

0和'\0'是相等的

0的asicc碼值就是0x00

14樓:

因為'\0' == 0

'\0'的asicc碼值就是0x00.一回事情

有關C語言的一些問題

include 後面要用到的toupper函式需要這個標頭檔案 include found include found void upfst char p 這句是當當前字元從字母變成空格時,表示離開了乙個單詞,將k改為0else if p toupper是將小寫字母變成大寫。這句是當k 0且當前字元...

關於藍橋杯C語言的一些問題,藍橋杯C語言題目

你是什麼組的,bai專職專科組還是本科du 今zhi年的題目前八題都對的話dao 只能的專60分,你第九題做一半,只屬能得一半分,也就是70多分,專職專科組的話應該可以進決賽了,要是本科組的話你就懸了,我是專職專科組的去年我做對9道題也就75分,進入決賽了,進入決賽的名次中等靠前,你看著辦吧,今年題...

關於C 指標的問題,C 中關於指標的一些問題

是你想多了 指標實際上也是乙個變數,也佔用記憶體,你用 取指標變數的位址,沒問題,它並不會給 指標變數 這個東西分配記憶體,只是把指標變數的位址值給你而已.這樣想吧,指標實際上也是乙個變數,只不過它的值是乙個位址,不是乙個整型,字元型.但是,但是,但是 重要的事說三遍 指標變數指向的位址是有具體型別...