memset()没有在c中设置内存

时间:2013-11-25 20:52:38

标签: c memset

如果我的格式不正确,我很抱歉,因为这是我的第一篇文章,我在网站上找不到处理我遇到的同一问题的帖子。我在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个空格,它们变为:
GATTGTNNNNNATATTTGACT

第二次在同一个连接字符串上调用它时它不起作用。 IE:
TAATTTGACT和TCTCC之间用6个空格分隔,因此长字符串应该成为:

GATTGTNNNNTAATTTGACTNNNNNNTCTCC
但它只显示:
GATTGTNNNNNATATTTGACTTCTCC

我已经添加了printfs来显示memset之前和之后的连接字符串,它们在输出中是相同的。
有时插入会添加额外的字符空间,但不会初始化它们,因此它们会打印废话(如预期的那样)。 IE:

GAATAAANNNNNNNNNNNNNNNNN¬GCTAATG
应该是 GAATAAANNNNNNNNNNNNNNNNNGCTAATG

我用for或while循环切换了memset,得到了相同的结果。我使用了一个中间字符*来重新分配并仍然得到相同的结果。我正在寻找关于我应该尝试检测错误的建议。

2 个答案:

答案 0 :(得分:1)

如果你可以考虑 一种完全不同的方法,我想提供这个:

我理解你的意图:用相同数量的“N”替换两个字符串之间的现有空格。 memset()(以及相关的内存分配)是执行的主要方法连接。

您在当前连接尝试中描述的问题是:
1) 垃圾嵌入到结果字符串中 2) 在某些非预期的内存位置写入“N” 3) “N”未写入其他预期的内存位置。

不同方法

首先: 验证分配给要修改的字符串的内存是否足以包含结果
第二个: 在尝试连接之前,验证要连接的所有字符串都已\0终止。
第三个​​: 使用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

我知道这种方法与您正在做的事情有很大不同 ,但它确实解决了至少从您的问题陈述中发现的问题。如果这没有意义,请告诉我,我会尽我所能解决问题。 (目前正在进行其他项目)

答案 1 :(得分:0)

看看你的memset:

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

那是目的地。不应该是:

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

否则我错过了pseuInts的含义。