char * a的strcat问题
包括
#include int main() { char *array[10]={}; char* token; token = "testing"; array[0] = "again"; strcat(array[0], token); }
为什么它会返回分段错误?
我有点困惑。
从技术上讲,这不是有效的C.(但它是有效的C ++。)
char *array[10]={};
你应该用
char *array[10] = {0};
这声明了一个包含10个指向char的指针的数组,并将它们全部初始化为空指针。
char* token; token = "testing";
这将令牌声明为指向char的指针,并将其指向不可修改的字符串文字。
array[0] = "again";
这将array
的第一个char
指针指向一个字符串文字,它(再次)是一个不可修改的char序列。
strcat(array[0], token);
strcat
将一个字符串连接到另一个字符串的末尾。 要使其工作,第一个字符串必须包含在可写存储中,并且具有足够的多余存储空间以包含第一个字符串中第一个终止空字符(’\ 0’)之外的第二个字符串。 这些都不适用于直接指向字符串文字的array[0]
。
你需要做的是这样的事情。 (你需要#include
和
。)
我已经去了大小和内存动态分配的运行时计算,因为我假设您正在测试未来字符串可能不是已知大小的位置。 在编译时已知字符串,您可以在编译时避免一些(或大部分)工作; 但是你也可以将"againtesting"
作为单个字符串文字。
char* token = "testing"; char* other_token = "again"; /* Include extra space for string terminator */ size_t required_length = strlen(token) + strlen(other_token) + 1; /* Dynamically allocated a big enough buffer */ array[0] = malloc( required_length ); strcpy( array[0], other_token ); strcat( array[0], token ); /* More code... */ /* Free allocated buffer */ free( array[0] );
这是如何工作的: char *array[10]
是一个包含10个char *
指针的数组(基本上与token
相同的10个)。
token = "testing"
在构建时在程序的内存中的某处创建静态空间,并将“测试”放在那里。 然后在运行时 ,它将地址放置到token
静态“测试”。
array[0] = "again"
基本上做同样的事情。
然后, strcat(array[0], token)
获取array[0]
地址,并尝试将token
的内容添加到该地址的字符串。 这会给你segfault,因为array[0]
指向你内存中的只读数据段。
如何正确地做到这一点:
char * initial = "first"; // pointer to static "first" string char * second = "another"; // another one char string[20]; // local array of 20 bytes strcpy(string, initial); // copies first string into your read-write memory strcat(string, second); // adds the second string there
实际上,如果你不想用脚射击自己,那么做最后两行的更好方法是:
snprintf(string, sizeof(string), "%s%s", initial, second);
然后snprintf
确保您不使用超过20个字节的string
。 如果复制的字符串比目标空间长, strcat
和strcpy
会愉快地超出限制进入无效内存,并导致另一个运行时段错误或更糟糕的事情(想想安全漏洞)。
要创建一个字符数组, char *array[10]={};
应该是char array[10]={};
发生分段错误是因为array [0]指向“again”,一个字符串文字,修改字符串文字是禁止(未定义的行为)
如果您计划更改所涉及的字符串,您应该为您需要的内容分配足够的内存。 例如,而不是char *token; token = "testing";
char *token; token = "testing";
你可以使用,比如char token[20] = "testing";
,它允许有足够的空间容纳19个字符的字符串(加上最后的空字节)。
同样,你可以使用char array[10][20] = {"testing"};
创建一个包含10个字符串的数组,并将第一个字符串设置为测试。
你在array[0]
放一个字符串,它只是一个字符。 像这样使用array[0]='a'
。