我有一个问题是关于如何操作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) 该计划是:
#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)
线,当我删除它程序正常工作.但我无法弄清楚原因.
这个板子似乎充满了这些类型的问题,我确实经历了其中的一些问题,但我仍然对这两者之间的区别感到困惑:
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解释了存储文字在内存中的位置: …
我想反转一个字符串,但我在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) 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 中的字符串分配给指针有效但整数无效。
#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 初学者,有以下代码。
#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 会打印两次,因为字符串似乎被复制到另一个上