首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘`char * str =“asdf”和` `char str[] =“asdf”的差异,strtok不工作

‘`char * str =“asdf”和` `char str[] =“asdf”的差异,strtok不工作
EN

Stack Overflow用户
提问于 2022-01-30 16:53:37
回答 1查看 49关注 0票数 -1

我的代码显示了这个问题。

代码语言:javascript
复制
   char str[] = "asdf=1=2=3"; // this works
   printf("type:  %s\n", typename(str)); // prints 'pointer to char'
   char *token = strtok(str, "=");
   printf("%s\n", token);

这不管用,为什么?

代码语言:javascript
复制
   char *str2 = "asdf=1=2=3"; // this wont work
   printf("type:  %s\n", typename(str2)); // prints 'pointer to char'
   printf("%s\n", str2);
   char *token2 = strtok(str2, "="); // segmentation fault
   printf("%s", token2); 

编辑:这是typename宏

代码语言:javascript
复制
#define typename(x) _Generic((x),        /* Get the name of a type */             \
                                                                                  \
        _Bool: "_Bool",                  unsigned char: "unsigned char",          \
         char: "char",                     signed char: "signed char",            \
    short int: "short int",         unsigned short int: "unsigned short int",     \
          int: "int",                     unsigned int: "unsigned int",           \
     long int: "long int",           unsigned long int: "unsigned long int",      \
long long int: "long long int", unsigned long long int: "unsigned long long int", \
        float: "float",                         double: "double",                 \
  long double: "long double",                   char *: "pointer to char",        \
       void *: "pointer to void",                int *: "pointer to int",         \
      default: "other")
EN

回答 1

Stack Overflow用户

发布于 2022-01-30 16:53:37

原因如下

代码语言:javascript
复制
   char * pointer_to_readonly_memory_string = "asdf";
   char pointer_to_memory_on_the_stack[] = "asdf";

   // pointer_to_readonly_memory_string[0] = 'b'; // segmentation fault
   pointer_to_memory_on_the_stack[0] = 'b';

   printf(" pointer_to_readonly_memory_string: %s\n", pointer_to_readonly_memory_string);
   printf(" pointer_to_memory_on_the_stack: %s\n", pointer_to_memory_on_the_stack);
代码语言:javascript
复制
char * varname = "asdf";

当您使用asteriks *初始化字符串并使用=赋值时,双引号"asdf"中的字符串将把字符串文字"asdf"放置在内存的只读部分,并使varname成为指向该值的指针,这使得对此内存的任何写入操作都是非法的。

代码语言:javascript
复制
char * varname = "asdf";

当您使用方括号[]并使用=赋值时,它将文本字符串放入只读内存中,再加上它将字符串复制到堆栈上新分配的内存中。这意味着内存是可以修改的。所以你可以这么做:varname[0] = 'b';

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70916832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档