簡體   English   中英

memset()沒有在c中設置內存

[英]memset() not setting memory in c

我很抱歉,如果我的格式不正確,因為這是我的第一篇文章,我在網站上找不到處理我遇到的同一問題的帖子。 我在ubuntu 12.04服務器上使用普通的C語言。 我試圖將幾個字符串連接成一個字符串,用Ns分隔。 但是,字符串之間的字符串大小和空格可能不同。 構造一個結構來將位置數據存儲為幾個可以傳遞給多個函數的整數:

typedef struct pseuInts {  
    int pseuStartPos;  
    int pseuPos;  
    int posDiff;  
    int scafStartPos;  
} pseuInts;  

以及字符串結構:

typedef struct string {  
    char *str;  
    int len;  
} myString;

由於串聯字符串存在中斷條件,因此組裝了動態鏈接列表的多個節點,其中包含標識符和連接字符串:

typedef struct entry {  
    myString title;  
    myString seq;  
    struct entry *next;  
} entry;  

memset調用如下:

} else if ((*pseuInts)->pseuPos != (*pseuInts)->scafStartPos) {  
    (*pseuEntry)->seq.str = realloc ((*pseuEntry)->seq.str, (((*pseuEntry)->seq.len) + (((*pseuInts)->scafStartPos) - ((*pseuInts)->pseuPos)))); //realloc the string being extended to account for the Ns  
    memset (((*pseuEntry)->seq.str + ((*pseuEntry)->seq.len)), 'N', (((*pseuInts)->scafStartPos) - ((*pseuInts)->pseuPos))); //insert the correct number of Ns
    (*pseuEntry)->seq.len += (((*pseuInts)->scafStartPos) - ((*pseuInts)->pseuPos)); //Update the length of the now extended string  
    (*pseuInts)->pseuPos += (((*pseuInts)->scafStartPos) - ((*pseuInts)->pseuPos)); //update the position values  
}  

如果決定是在由main調用的函數調用的函數中,則這些都被解除引用,但是對於pseuEntry結構的更改需要在main中更新,以便傳遞給另一個函數以進行進一步處理。
我通過插入一些printf命令仔細檢查了pseuInts中使用的數字,並且它們在定位需要添加多少N時是正確的,即使它們在不同的短字符串之間發生變化也是如此。 但是,當程序運行時,memset僅在第一次調用時插入Ns。 IE:

GATTGT和TAATTTGACT由4個空格分隔,它們變為:
GATTGTNNNNTAATTTGACT

第二次在同一個連接字符串上調用它時它不起作用。 IE:
TAATTTGACT和TCTCC之間用6個空格分隔,因此長字符串應該變為:

GATTGTNNNNTAATTTGACTNNNNNNTCTCC
但它只顯示:
GATTGTNNNNTAATTTGACTTCTCC

我已經添加了printfs來顯示memset之前和之后的連接字符串,它們在輸出中是相同的。
有時插入會添加額外的字符空間,但不會初始化它們,因此它們會打印廢話(如預期的那樣)。 IE:

GAATAAANNNNNNNNNNNNNNNNN¬GCTAATG
應該
GAATAAANNNNNNNNNNNNNNNNNGCTAATG

我用for或while循環切換了memset,得到了相同的結果。 我使用了一個中間字符*來重新分配並仍然得到相同的結果。 我正在尋找關於我應該嘗試檢測錯誤的建議。

如果您考慮采用完全不同的方法,我想提供:

我理解你的意圖: 用相同數量的“N”替換兩個字符串之間的現有空格。 memset() (和相關的內存分配)是執行連接的主要方法。

您當前連接嘗試所描述的問題是:
1)嵌入在結果字符串中的垃圾。
2)在一些非預期的內存位置寫“N”。
3) “N”未寫入其他預期的存儲位置。

不同的方法

第一:驗證分配給正在修改的字符串的內存是否足以包含結果
第二:驗證在連接嘗試之前,所有要連接的字符串都是\\0終止。
第三 strcat() 使用strcat()for(;;)循環追加所有“N”,最后追加后續字符串。

例如。

for(i=0;i<numNs;i++)//compute numNs with your existing variables 
{
    strcat(firstStr, "N");//Note: "N" is already NULL term. , and strcat() also ensures null term.
}
strcat(firstStr, lastStr); //a null terminated concatenation

我知道這種方法與你所做的大不相同 ,但它至少解決了你的問題陳述中發現的問題。 如果這沒有意義,請告訴我,我會盡我所能解決問題。 (目前正在進行其他項目)

看看你的memset:

memset (((*pseuEntry)->seq.str + ((*pseuEntry)->seq.len))), ...

那是目的地。 不應該是:

(memset (((*pseuEntry)->seq.str + ((*pseuEntry)->seq.len) + ((*pseuEntry)->seq.pseuStartPos))

否則我錯過了pseuInts的pseuInts

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM