当前位置:编程学习 > C/C++ >>

以下代码执行错误,将char* string改为char string[]则可以正确执行,求问为何?

#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char* delimiters=" .,"; char* string="This is a sample string, which can be separated into 12 tokens.",*token; token=strtok(string,delimiters); printf("%s\n",token); for(;;) { token=strtok(NULL,delimiters); if(token==NULL) break; printf("%s\n",token); } system("PAUSE"); return 0; }
答案:char* string="This is a sample string, which can be separated into 12 tokens."
这样string定义到了【文字常量区】(你要重点理解这个)
使得string成为了一个指向常量的指针,也就是其所指内容不可更改
而strtok函数需要更改第一个参数,从而导致错误。
错误号应该为
*.exe中有未经处理的异常:0x*写入位置0x*时发生访问冲突
更改为char []后string分配在栈上,即可更改内容。
其他:char *string是定义一个指针。
char shtring[]是定义一个字符数组,长度由初始化字符串决定;同时也可以表示指向字符数组的指针,而在c里面字符串就是以‘\00’结尾的字符数组。 char* string 定义的是一个指针,指向的是字符串常量,该内容位于静态区内存,既然是常量,内容就无法修改。
char string[],定义的是字符数组, 该字符数组是栈内存,用户可以修改其中内容..

程序是在strtok函数内挂掉的,这个字符串拆分函数一定是对string内存进行了修改,导致崩溃。

例如 char *p1 = "Hello"; 
       p1[0] = 'A';                // 出错

       char p2[] = "Hello";
        p2[0] = 'A';               // 正常


你遇到的问题 其实跟这个差不多类似

上一个:c++队列问题 从第一张牌仍掉开始,把第一张牌扔掉,然后开始把新的第一张放在整碟牌的后面。
下一个:string s; cout<<s[0]<<endl;合法吗

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,