相关疑难解决方法(0)

C中的初始化字符串

我有一个问题是关于如何操作c字符串初始化的正确方法例如下一个代码,并不总是正确的.

char *something;
something = "zzzzzzzzzzzzzzzzzz";
Run Code Online (Sandbox Code Playgroud)

我测试了一点点增加了zetas的数量,并且有效地使程序崩溃了两行,那么这个char数组的实际大小限制是多少?我怎么能确定它不会崩溃,这个限制实现是否依赖?以下代码是否始终必须使用正确的方法?

char something[FIXEDSIZE];
strcpy(something, "zzzzzzzzzzzzzzzzzzz");
Run Code Online (Sandbox Code Playgroud)

c arrays initialization char

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

为什么这个小C程序会崩溃?

该计划是:

#include <stdio.h>
#include <stdlib.h>
int main(void) {
    char *a="abc",*ptr;
    ptr=a;
    ptr++;
    *ptr='k';
    printf("%c",*ptr);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题在于

*ptr='k';  
Run Code Online (Sandbox Code Playgroud)

线,当我删除它程序正常工作.但我无法弄清楚原因.

c crash

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

char*string ="你好"; 内存地址空间

这个板子似乎充满了这些类型的问题,我确实经历了其中的一些问题,但我仍然对这两者之间的区别感到困惑:

char string[] = "Hello"; 
char * string2 = "hello";
Run Code Online (Sandbox Code Playgroud)

现在,

char string[] = "Hello"; 
Run Code Online (Sandbox Code Playgroud)

...是一个数组,分配了6个连续的存储器地址空间,用于存储字符,最后包括\ 0.

&p%p显示内存地址0x7fffbcabce90.%P字符串示出了相同存储器地址0x7fffbcabce90.%P字符串[1]示出了0x7fffbcabce90 + typeof运算(炭),所以0x7fffbcabce91.等等

char * string2 = "hello";
Run Code Online (Sandbox Code Playgroud)

...是指向char类型的指针,它指向字符串第一个字符的内存地址(h).

%P&字符串2示出存储器地址0x7fffbcabce88.%P字符串2示出0x400ca8的不同的存储器地址.%P字符串2 [1]示出了0x400ca8 +的sizeof(char)的,所以0x400ca9.

我的问题是:这个内存地址范围什么(0x400000)?这是我无法修改字符串字符的原因吗?:

string[1] = 'c';   //that works
string2[1] = 'c';  //not working
Run Code Online (Sandbox Code Playgroud)

谢谢!

编辑:拼写错误(%string2 =>&string2)

Edit2:正如我所解释的那样,关键字是字符串文字.

char * string2[] = "Hello"; 
Run Code Online (Sandbox Code Playgroud)

...是指向字符串文字的指针.这是一个线索,其中R Samuel Klatchko解释了存储文字在内存中的位置: …

c memory linker operating-system

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

为什么我得到EXC_BAD_ACCESS?

我想反转一个字符串,但我在swap char上出错了.

有人可以帮我吗?

char*  reverse_char(char* src){
    char *p,*q;
    p = q = src;
    while(*(p) != '\0'){
        p++;
    }
    p--;

    char  temp = '\0';
    while (p > q) {
        temp = *p;
        *p = *q; // I got exec bad access here ??? why 
        *q = temp;
        p--;
        q++;
    }
    return src;
}
Run Code Online (Sandbox Code Playgroud)

这是主要方法.

int main(int argc, char const* argv[])
{
    char *hi = "hello world!\n";
    printf("%s", hi);

    reverse_char(hi);
    printf("%s", hi);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c exc-bad-access

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

C中的char * vs const char *

char* str ="Hello";
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,文字“ Hello”存储在DATA段中,并且是只读的。所以总是声明它不是更好:

const char* str = "Hello";
Run Code Online (Sandbox Code Playgroud)

避免使用不正确的代码,例如:

*(str+1) = 't';
Run Code Online (Sandbox Code Playgroud)

c pointers const-correctness c-strings string-literals

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

将字符串分配给 char 指针是有效的,但将整数分配给 int 指针在 C 中无效。为什么?

可以为字符指针分配任意字符串,但不能为整数指针分配整数。由于它们都是指针并包含地址。为什么在动态分配之前将 C 中的字符串分配给指针有效但整数无效。

#include<stdio.h>

int main()
{
        char *s = "sample_string"; // valid
        printf("%s\n", s);
        int *p = (int)5; // invalid
        printf("%d\n", *p);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

这给出了输出:

sample_string
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

背后的原因是什么?虽然它们在 C++ 中都是无效的。

c pointers character dynamic-memory-allocation

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

为什么第二次打印没有显示任何内容

我是 C 初学者,有以下代码。

#include <stdio.h>
#include<string.h>
int main(void){
    char *s1="abcd";
    char s2[30]="abcd";
    if(strcmp(s1,s2)){
        printf("sirurile sunt identice\n");
    }else printf("sirurile sunt diferite\n");
    strcpy(s2,s1);
    printf("%s\n",s1);
    strcpy(s1,s2);
    printf("%s\n",s2);
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

我试图理解为什么输出不考虑第二次打印并仅显示第一个“abcd”。输出为: Sirurile sunt differite abcd

我预计 abcd 会打印两次,因为字符串似乎被复制到另一个上

c

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