相关疑难解决方法(0)

Gcc编译器C字符串赋值问题

我写了这段代码,因为我在写一个更大的程序时遇到了类似的问题.尽管如此,我知道问题是一样的,所以我做了一个小例子.

#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编译器?

c string gcc tcc variable-assignment

0
推荐指数
1
解决办法
1106
查看次数

当我尝试修改字符串常量时,为什么会出现分段错误?

可能重复:
为什么在写入字符串时会出现分段错误?

我希望这个程序的输出是: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)

c string

0
推荐指数
2
解决办法
390
查看次数

使用C++替换字符串文字中的几个字符

我有

cost char* a="test_r.txt"
Run Code Online (Sandbox Code Playgroud)

我想剥离_r并添加_n而不是它,以便它变成"test_n.txt"并将其保存在const char*b中;

最简单的方法是什么?

c++

0
推荐指数
1
解决办法
207
查看次数

反转字符串c ++时出现访问冲突错误

可能重复:
为什么在写入字符串时会出现分段错误?

以下简单函数应该反转字符数组.

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)

任何想法为什么会发生?

c++ char

0
推荐指数
1
解决办法
716
查看次数

C :为什么只有一些文字字符串会导致我的程序崩溃?

我尝试了以下程序:

#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)

s2s4导致分段错误,大概是因为它们存储在只读数据段中。怎么会在文字字符串的指向s1s3不崩溃?这是在 Ubuntu 上。

奇怪的是,s1, s2,s3s4都可以修改,并且在 cygwin 上使用 gcc …

c string

0
推荐指数
1
解决办法
241
查看次数

分段在动态数组上使用tolower()时出错

我将此代码放在我的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)

循环工作正常.任何人都可以告诉为什么会这样吗?

c arrays tolower

-1
推荐指数
1
解决办法
259
查看次数

如何告诉C编译器不要重叠我的字符串

我正在开发一个在数组中包含字符串的应用程序:

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)

c arrays string

-1
推荐指数
1
解决办法
85
查看次数

Derefence指针并为其赋值

我对这种行为感到很困惑:

int main(void) {
    char *test_string = "test_string";
    *test_string = 'a'; //segfaults
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

DEMO

int main(void) {
    char test_string[] = "test_string";
    *test_string = 'a'; //OK
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

DEMO

我预计它应该有相同的工作,因为N1570, Section 6.3.2.1(p3)声明如下:

除非它是运算sizeof符,_Alignof 运算符或unary &运算符的操作数,或者是用于初始化数组的字符串文字,否则具有类型''数组'类型'的表达式将转换为类型为''指针的表达式键入''指向数组对象的初始元素,而不是左值.

为什么第一个段错?

c arrays pointers segmentation-fault string-literals

-1
推荐指数
1
解决办法
51
查看次数

剥去C中字符串的结尾

我需要一个函数来)从字符串的末尾删除字符.例如,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)

但输出中没有显示任何内容.

c string parsing pointer-arithmetic

-2
推荐指数
1
解决办法
148
查看次数

在另一个函数中修改char*?(分段故障)

我正在尝试修改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)

c arrays segmentation-fault

-2
推荐指数
1
解决办法
139
查看次数