繁体   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