int _tmain(int argc, _TCHAR* argv[])
{
char *s="Golden Global View";
    char *d="Hello, GGV Programmers";
  
    strncpy(d,s,strlen(s));
printf("%s\n",d);
            
    getchar(); return 0;
}
运行错误,调出了strncpy.asm,why?
感觉虽然strncpy是弃用函数,但这段函数并未造成溢出啊

解决方案 »

  1.   

    // 换成数组形式, 足够大就行了
    char   d[32]="Hello,   GGV   Programmers";
      

  2.   

    char   *s="Golden   Global   View"; 
    char   *d="Hello,   GGV   Programmers";
    两个指针都是指向不可修改的静态区
    所以strncpy(d,s,strlen(s)); 写d的内存时出错
    “运行错误,调出了strncpy.asm,why?”
    VC实现的strncpy为提高效率使用了汇编实现,所以进入了汇编文件中访问地址出错的地方
      

  3.   

    char *d="Hello, GGV Programmers"; 
    这行代码是把字符串的指针赋给指针变量d;而该字符串是只读的(其内存空间位于代码段),所以当要修改d指向的内存空间时会非法操作。因为是在strncpy函数中执行了非法操作,所以调试功能自动定位到了执行非法操作的代码上,即调出了strncpy.asm。程序的正确写法见1楼。