我写了这段代码,因为我在写一个更大的程序时遇到了类似的问题.尽管如此,我知道问题是一样的,所以我做了一个小例子.
#include <stdio.h>
typedef struct
{
int x;
char * val;
}my_struct;
int main()
{
my_struct me = {4, " "};
puts("Initialization works.");
me.val[0] = 'a';
puts("Assignment works.");
puts(me.val);
puts("Output works.");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当使用tcc(Tiny C Compiler)编译时,它编译并执行正常.但是,使用GCC 4.6.0 20110513(预发行版)它会编译,但是,当我执行它时,我只能通过"初始化工作".在获得段错误之前.
我究竟做错了什么?是我的代码还是我的GCC编译器?
可能重复:
为什么在写入字符串时会出现分段错误?
我希望这个程序的输出是:ibjgsjfoet但是我得到了一个分段错误.
#include <stdio.h>
int main()
{
char *p="haifriends",*p1;
p1=p;
while(*p!='\0')
++*p++;
printf("%s %s",p,p1);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有
cost char* a="test_r.txt"
Run Code Online (Sandbox Code Playgroud)
我想剥离_r并添加_n而不是它,以便它变成"test_n.txt"并将其保存在const char*b中;
最简单的方法是什么?
可能重复:
为什么在写入字符串时会出现分段错误?
以下简单函数应该反转字符数组.
void reverse(char* str)
{
char* last = str;
// find end of the string
while(*last) {
++last;
}
// swap characters until the pointers meet in the middle
while(str < last)
{
--last;
char temp = *str;
*str = *last;
*last = temp;
++str;
}
}
int main()
{
char* a= "Hello";
reverse(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码编译.但它会引发有关访问冲突的运行时错误.根据调试器,罪魁祸首是以下行:
char temp = *str;
Run Code Online (Sandbox Code Playgroud)
任何想法为什么会发生?
我尝试了以下程序:
#include <stdio.h>
char s1[] = "Global String";
char *s2 = "Another Global String";
main()
{
char s3[] = "Local String" ;
char *s4 = "Another Local String" ;
strcpy( s1, "New str" );
strcpy( s2, "New str" ); // causes seg fault
strcpy( s3, "New str" );
strcpy( s4, "New str" ); // causes seg fault
}
Run Code Online (Sandbox Code Playgroud)
s2并s4导致分段错误,大概是因为它们存储在只读数据段中。怎么会在文字字符串的指向s1和s3不崩溃?这是在 Ubuntu 上。
奇怪的是,s1, s2,s3和s4都可以修改,并且在 cygwin 上使用 gcc …
我将此代码放在我的C编译器(Dev Cpp)上.
char *str = "SomeTHing";
for(int i = 0; str[i]; i++){
str[i] = tolower(str[i]);
}
Run Code Online (Sandbox Code Playgroud)
这给出了分段错误,而如果我使用静态数组,
char str[10] = "SomeTHing";
Run Code Online (Sandbox Code Playgroud)
循环工作正常.任何人都可以告诉为什么会这样吗?
我正在开发一个在数组中包含字符串的应用程序:
static char * strings[] = {
"ABC DEF",
"EF",
"GHI"
};
Run Code Online (Sandbox Code Playgroud)
注意,该类型没有const修饰符!
在我的应用程序中,我循环数组并还原字符串.预期的结果是:
{
"FED CBA",
"FE",
"IHG"
}
Run Code Online (Sandbox Code Playgroud)
但是我得到的结果是:
{
"FED CAB",
"AB",
"IHG"
}
Run Code Online (Sandbox Code Playgroud)
原因是因为在原始数组中,字符串被编译为重叠:strings [1]与字符串[0]的末尾重叠!
// When I printed out the pointers it turned out that in the RAM
// it stored my strings "overlapping":
// 00 01 02 03 04 05 06 07 08 09 0a 0b
// "A B C __ D E F \0 G H I \0"
static char * strings[] = …Run Code Online (Sandbox Code Playgroud) 我对这种行为感到很困惑:
int main(void) {
char *test_string = "test_string";
*test_string = 'a'; //segfaults
return 0;
}
Run Code Online (Sandbox Code Playgroud)
int main(void) {
char test_string[] = "test_string";
*test_string = 'a'; //OK
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我预计它应该有相同的工作,因为N1570, Section 6.3.2.1(p3)声明如下:
除非它是运算
sizeof符,_Alignof运算符或unary &运算符的操作数,或者是用于初始化数组的字符串文字,否则具有类型''数组'类型'的表达式将转换为类型为''指针的表达式键入''指向数组对象的初始元素,而不是左值.
为什么第一个段错?
我需要一个函数来)从字符串的末尾删除字符.例如,hello,world)应该转换为hello,world.
我写了这个:
char *a="hello,world)";
int a_len=strlen(a);
*(a+a_len-1)='\0';
printf("%s", a);
Run Code Online (Sandbox Code Playgroud)
但输出中没有显示任何内容.
我正在尝试修改main(tab)中声明的char数组.所以我将它发送到modify_tab并修改它.但它不起作用并向我发送分段错误.这是我的代码:
1?void my_putstr(char *str)
2?{
3? int i;
4?
5? i = 0;
6? while (str[i] != '\0')
7? {
8? write(1, &str[i], 1);
9? i++;
10? }
11?}
12?
13?void modify_tab(char *tab)
14?{
15? char *map;
16?
17? map = tab;
18? map[3] = 'a';
19? my_putstr(map);
20?}
21?
22?void main()
23?{
24? char *tab;
25?
26? tab = "0123456789\n\0";
27? my_putstr(tab);
28? modify_tab(tab);
29?}
Run Code Online (Sandbox Code Playgroud)