這是結構的外觀以供參考:
struct thread_data {
struct ringbuf_t *rb;
char *file_name;
};
我需要獲取命令列引數并將其存盤thread_data在threads陣列中每個元素的結構成員變數中,如下所示:
for (int index = optind; index < argc; index ) {
threads[length].rb = rb;
memmove(&threads[length].file_name, &argv[index], strlen(argv[index]));
strcpy(threads[length].file_name, argv[index]);
length;
}
以前使用memcpy過,當我列印變數時它起作用了。但是,Valgrind 給了我這個:
==465645== Source and destination overlap in strcpy(0x1fff000b54, 0x1fff000b54)
==465645== at 0x4C3C180: strcpy (vg_replace_strmem.c:523)
==465645== by 0x400F85: main (bytemincer.c:55)
所以我使用了memmove并且我仍然得到了相同的 Valgrind 結果。有什么解決辦法嗎?
uj5u.com熱心網友回復:
這就是你想要的結果:
(我在帖子中使用“fn”而不是“file_name”。)
*(argv[0]) @ 0x2000
--- --- - - ---
--------------->| | | … | 0 |
argv @ 0x1000 | --- --- - - ---
--------------- |
| 0x2000 ------- *(argv[1]) @ 0x2100
--------------- --- --- - - ---
| 0x2100 ----------- ----------->| | | … | 0 |
--------------- | --- --- - - ---
| 0x2200 -----------)----
--------------- | | *(argv[2]) @ 0x2200
| ? | | | --- --- - - ---
| ------->| | | … | 0 |
rb @ 0x3000 | | --- --- - - ---
--------------- | |
| 0x4000 ------- | | *rb @ 0x4000
--------------- | | | ---------------
---)---)------->| |
threads @ 0x5000 | | | ---------------
--------------- | | |
| ----------- | | | |
|rb| 0x4000 -------- | |
| ----------- | | | |
|fn| 0x2100 --------)--- |
| ----------- | | |
--------------- | |
| ----------- | | |
|rb| 0x4000 -------- |
| ----------- | |
|fn| 0x2200 ----------------
| ----------- |
---------------
| ? |
(這假設threads是一個陣列而不是指向陣列的指標。這不會影響帖子的其余部分。)
當然,所有地址都是編造的。但是您可以看到多次變數具有相同的值地址。因為讓多個指標指向同一個記憶體塊是完全沒問題的。我們需要做的就是復制指標(地址)。
要復制指標,您需要做的就是
dst = src;
所以你只需要
threads[length].rb = rb;
threads[length].fn = argv[index];
盡管
memmove(&threads[length].rb, &rb, sizeof(threads[length].rb));
memmove(&threads[length].fn, &argv[index], sizeof(threads[length].fn));
和
memmove(&threads[length].rb, &rb, sizeof(rb));
memmove(&threads[length].fn, &argv[index], sizeof(argv[index]));
相當于任務,做一些復雜的事情是沒有意義的:
(注意使用sizeof(argv[index])而不是strlen(argv[index])。它是我們正在復制的指標,所以我們需要指標的大小。)
警告來自嘗試將緩沖區中 0x2100 處的字串復制到 0x2100 處的緩沖區中。請記住,threads[length].fn并且argv[index]都有后的相同的值(地址)memmove。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/361154.html
