strncpy strlen 操作时内存问题

Dking2022 2013-07-17 08:13:37
#include <stdio.h>
#include <string.h>
main ( )
{
char *s="B012345678901A234567890987654321";
char *q;
char *p;
char *m;
char *n;

q=s;
m = strstr(q,"B01");
p = strstr(q,"901");

strncpy(n,q,p-m);
n[p-m]='\0';

printf ("n---%s\n",n);
printf("****************\n");
printf ("p---%s\n",p);
}
代码如上
此时执行的结果(符合预期的):
n---B012345678
****************
p---901A234567890987654321

将代码中的 n[p-m]='\0';
改成 n[p-m+1]='\0';
时执行结果(非预期):
n---B012345678a
****************
p---901A234567890987654321
且 n 的值的最后一位不可预测
请问:各位大虾 这就是野值吗 ? 如果是那我要如何在保证位数的情况下保证结果的可预见性呢?
比如 对 n[p-m]=' ';赋空值 还有其它方法能实现吗?
...全文
241 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
水平不流 2013-07-19
  • 打赏
  • 举报
回复
都没分配内存空间.
Dking2022 2013-07-19
  • 打赏
  • 举报
回复
引用 11 楼 max_min_ 的回复:
[quote=引用 10 楼 xt586 的回复:] [quote=引用 3 楼 zyaiwx 的回复:] 写缓冲一般使用数组。 char buf[1024];之类。 或者你嘚动态分配一个连续空间
嗯 谢谢大虾 顺便再请问一下 如果是动态分配内存的话 你一般会用 malloc 还是如何操作??[/quote] 如果需要动态分配内存的话,不是很大一般都是用malloc 或者new 来分配, [/quote] 嗯 学习了 谢谢
Dking2022 2013-07-19
  • 打赏
  • 举报
回复
引用 4 楼 cfjtaishan 的回复:
n是野指针的。还有要对strstr函数的返回值做判断,因为如果没有找到,会返回NULL的,如果是NULL,那么下面的p-m就不可以用了。
学习了 逻辑确实没有考虑那么多 想了解一下,有时的执行结果如下: n---B012345678X**************** p---901A234567890987654321 也就是说‘\n’没了 这个怎么解释呢?
max_min_ 2013-07-18
  • 打赏
  • 举报
回复
引用 10 楼 xt586 的回复:
[quote=引用 3 楼 zyaiwx 的回复:] 写缓冲一般使用数组。 char buf[1024];之类。 或者你嘚动态分配一个连续空间
嗯 谢谢大虾 顺便再请问一下 如果是动态分配内存的话 你一般会用 malloc 还是如何操作??[/quote] 如果需要动态分配内存的话,不是很大一般都是用malloc 或者new 来分配,
Dking2022 2013-07-18
  • 打赏
  • 举报
回复
引用 3 楼 zyaiwx 的回复:
写缓冲一般使用数组。 char buf[1024];之类。 或者你嘚动态分配一个连续空间
嗯 谢谢大虾 顺便再请问一下 如果是动态分配内存的话 你一般会用 malloc 还是如何操作??
Dking2022 2013-07-18
  • 打赏
  • 举报
回复
引用 2 楼 yiyefangzhou24 的回复:
char n[1024;
谢谢你 我发这个主要是要大家帮我分析下 我经常不注意的地方 修改的方案我其实知道 但只知其然 不知其所以然
Dking2022 2013-07-18
  • 打赏
  • 举报
回复
引用 1 楼 Idle_Cloud 的回复:
strncpy(n,q,p-m); n没有分配内存,非法空间,所以结果不可预见,需要给n分配内存。
嗯 确实没有分配内存的 这个可以分配一个 那请问一下 p = strstr(q,"901"); 这样执行后 p 是不用再分配内存的 ? 它已经指向了 内存中 q 中的901的位置呢?
mujiok2003 2013-07-17
  • 打赏
  • 举报
回复
/* strstr example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="This is a simple string";
  char * pch;
  pch = strstr (str,"simple");
  strncpy (pch,"sample",6);
  puts (str);
  return 0;
}
//This is a sample string
mujiok2003 2013-07-17
  • 打赏
  • 举报
回复

char * strncpy ( char * destination, const char * source, size_t num );
destination必须可写。
buyong 2013-07-17
  • 打赏
  • 举报
回复
char *n = new char(1024);
自信男孩 2013-07-17
  • 打赏
  • 举报
回复
n是野指针的。还有要对strstr函数的返回值做判断,因为如果没有找到,会返回NULL的,如果是NULL,那么下面的p-m就不可以用了。
zybjtu 2013-07-17
  • 打赏
  • 举报
回复
写缓冲一般使用数组。 char buf[1024];之类。 或者你嘚动态分配一个连续空间
yiyefangzhou24 2013-07-17
  • 打赏
  • 举报
回复
char n[1024;
Carl_CCC 2013-07-17
  • 打赏
  • 举报
回复
strncpy(n,q,p-m);
n没有分配内存,非法空间,所以结果不可预见,需要给n分配内存。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧