#include <string.h>
int main()
{
char *array[10]={};
char* token;
token = "testing";
array[0] = "again";
strcat(array[0], token);
}
为什么它会返回分段错误?
我有点困惑。
答案 0 :(得分:6)
从技术上讲,这不是有效的C.(但它是有效的C ++。)
char *array[10]={};
你应该使用
char *array[10] = {0};
这声明了一个包含10个指向char的指针的数组,并将它们全部初始化为空指针。
char* token;
token = "testing";
这将令牌声明为指向char的指针,并将其指向不可修改的字符串文字。
array[0] = "again";
这将char
的第一个array
指针指向一个字符串文字,其中(再次)是一个不可修改的字符序列。
strcat(array[0], token);
strcat
将一个字符串连接到另一个字符串的末尾。要使其工作,第一个字符串必须包含在可写存储中,并且具有足够的多余存储空间以包含第一个字符串中第一个终止空字符('\ 0')之外的第二个字符串。这些都不适用于直接指向字符串文字的array[0]
。
你需要做的是这样的事情。 (您需要#include
<string.h>
和<stdlib.h>
。)
我已经选择了大小和内存动态分配的运行时计算,因为我假设您正在测试未来字符串可能不是已知大小的位置。使用编译时已知的字符串,您可以在编译时避免一些(或大部分)工作;但是你也可以将"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] );
答案 1 :(得分:2)
这是如何工作的:char *array[10]
是一个包含10个char *
指针的数组(基本上与token
完全相同)。
token = "testing"
在构建时在程序的内存中的某处创建静态空间,并在其中进行“测试”。然后在运行时,它将地址放到静态“测试”到token
。
array[0] = "again"
基本上做同样的事情。
然后,strcat(array[0], token)
获取array[0]
中的地址,并尝试将token
的内容添加到该地址的字符串中。这会给你带来段错误,因为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
会愉快地超出限制进入无效内存,导致另一个运行时段错误或更糟糕的事情(想想安全漏洞)。
答案 2 :(得分:0)
要创建一个字符数组,char *array[10]={};
应该是char array[10]={};
发生分段错误,因为array [0]指向“again”,一个字符串文字,修改字符串文字是no-no(未定义的行为)
答案 3 :(得分:0)
如果您计划更改所涉及的字符串,您应该为您需要的内容分配足够的内存。例如,您可以使用char *token; token = "testing";
代替char token[20] = "testing";
,例如char array[10][20] = {"testing"};
,它允许有足够的空间容纳19个字符的字符串(加上最后的空字节)。
同样,您可以使用{{1}}创建一个包含10个字符串的数组,并将第一个字符串设置为测试。
答案 4 :(得分:-2)
您在array[0]
放置一个只有一个字符的字符串。
像这样使用array[0]='a'
。