我的代码显示了这个问题。
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);这不管用,为什么?
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宏
#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")发布于 2022-01-30 16:53:37
原因如下
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);char * varname = "asdf";当您使用asteriks *初始化字符串并使用=赋值时,双引号"asdf"中的字符串将把字符串文字"asdf"放置在内存的只读部分,并使varname成为指向该值的指针,这使得对此内存的任何写入操作都是非法的。
char * varname = "asdf";当您使用方括号[]并使用=赋值时,它将文本字符串放入只读内存中,再加上它将字符串复制到堆栈上新分配的内存中。这意味着内存是可以修改的。所以你可以这么做:varname[0] = 'b';
https://stackoverflow.com/questions/70916832
复制相似问题