为什么下面的代码给出了Seg.最后一行出错?
char* m=ReadName();
printf("\nRead String %s\n",m); // Writes OK
char* token;
token=strtok(m,'-');
Run Code Online (Sandbox Code Playgroud)
如上所述,读取字符串打印没有问题,但为什么不能拆分为令牌?
这有什么区别:
char arr[] = "Hello, world!";
Run Code Online (Sandbox Code Playgroud)
还有这个:
char *arr = "Hello, world!";
Run Code Online (Sandbox Code Playgroud)
两个字符串的内存在哪里分配?为什么我无法更改后一个字符串的内容?
我认为这个问题是这个SO答案的延伸.说我有以下代码:
#include <stdio.h>
#include <string.h>
void func(char *str)
{
strcpy(str, "Test");
}
int main()
{
char testStr[20] = "Original";
func(testStr);
printf("%s\n", testStr); /* Prints "Test" followed by a new-line */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,不应该func期望指向只读文字的指针作为参数?然而,传递的是只读文字堆栈上的副本.
即使这会产生正确的结果,这样做是否100%正确?难道提高代码的可读性,如果func()接受char [],而不是char *?
我真的很困惑在字符串上使用指针.感觉他们遵守不同的规则.请考虑以下代码
char *ptr = "apple";// perfectly valid here not when declaring afterwards like next
ptr = "apple"; // shouldn't it be *ptr = "apple"
Run Code Online (Sandbox Code Playgroud)也printf()表现不同-
printf("%s", ptr) // Why should I send the address instead of the value
Run Code Online (Sandbox Code Playgroud)我还在一本书中看到了以下代码
char str[]="Quest";
char *p="Quest";
str++; // error, constant pointer can't change
*str='Z'; // works, because pointer is not constant
p++; // works, because pointer is not constant
*p = 'M'; // error, because string is constant
Run Code Online (Sandbox Code Playgroud)我无法理解应该暗示什么
请帮忙,我在其他地方找不到任何信息
同一变量的这两种形式,当在功能块的范围内定义时,我认为应该具有相同的范围,即在{...}定义它们的功能块内:
char str1[] = "int_1 < int_2";
char *str1 = "int_1 < int_2";
Run Code Online (Sandbox Code Playgroud)
但我的观察是,char *生命超出了功能范围,而char []不再存在。str1两种情况下的符号名称都指向变量在内存中创建的位置,那么为什么一个似乎存在于函数之外,而另一个却没有呢?以下代码可用于测试此行为:(#define从0为1 选择一种形式而不是另一种形式以进行说明。)
另请注意,尽管static修饰符可用于修改范围,但此处故意不使用它来观察没有它的行为。
#define DO (1) //define as either 1 or 0
char * compare_int(int x1, int x2);
int main(void)
{
int a = 0;
int b = 0;
int c = '\n';
srand(clock()/CLOCKS_PER_SEC);
while(c != 'q')
{
a = rand()%3;
b = rand()%3;
printf("%s\n( enter 'q' to …Run Code Online (Sandbox Code Playgroud) 我很困惑我们如何能够从函数返回字符串.
char* someFunction()
{
return "Hello, World"
}
Run Code Online (Sandbox Code Playgroud)
上面的return语句不应抛出"函数返回局部变量的地址",它与函数有什么不同:
char* newFunction()
{
char temp[] = "Hello, World";
return temp;
}
Run Code Online (Sandbox Code Playgroud)
实际上确实给出了上面提到的警告.
有一个程序:
#include<stdio.h>
int main()
{
char str[20] = "Hello";
char *const p=str;
*p='M';
printf("%s\n", str);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这打印Mello作为答案..但由于p是一个常量指针,它不应该给出错误吗?
这是代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void reverse(char *c){
int len = strlen(c);
char tmp;
int i;
for(i = 0; i < len; i++){
tmp = c[len-1-i];
c[len-1-i] = c[i];
c[i] = tmp;
}
}
int main(){
char *s = "antonio";
//printf("%zd\n", strlen(s));
reverse(s);
printf("%s\n", s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是反向(char*c),它需要一个字符串广告反转它,但我不明白它出错的地方.
当我想在C结构中存储动态数据数组时,有两种方法可以编写它:
typedef struct {
int row;
int col;
char* data;
} item1;
Run Code Online (Sandbox Code Playgroud)
要么
typedef struct {
int row;
int col;
char data[];
} item2;
Run Code Online (Sandbox Code Playgroud)
他们俩都会工作.但他们在我的64位Mac OSX上有一些差异,使用gcc Apple LLVM 5.1版(clang-503.0.38):
sizeof(item1) is 16
sizeof(item2) is 8
Run Code Online (Sandbox Code Playgroud)
为什么有区别?而且,这两种实现还有什么不同?
完整的测试代码是:
#include <stdio.h>
typedef struct {
int row;
int col;
char* data;
} item1;
typedef struct {
int row;
int col;
char data[];
} item2;
int main() {
printf("%d %d\n", sizeof(item1), sizeof(item2));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
16 8
Run Code Online (Sandbox Code Playgroud) 我已经阅读了很多关于它的线索和问题并阅读了很多答案但是仍然难以理解差异以及何时应该使用什么?
我认为你应该在需要存储数据时使用char*而你不知道它的大小,因为它是动态的.另外我不确定我是对的,但是如果你宣布一个char*并且给它分配一个像这样的文字文本,我会理解我的理解:char*ch ="hi"; 它是一个常量,你无法改变,如果你试图改变它,你只需将ch指向另一个分配的内存空间保存新字符串?如果这样写:char ch = malloc(20); 然后你可以改变价值,如果你这样做:char ch [] ="hi"; char pch = ch; 您可以更改值,因为您指向数组并且数组指向ch [0]?
所有写的都是粗体是我从阅读中理解的,虽然我可能对我刚才说的大部分内容都是错的,这就是为什么我需要一个非常好的和简单的解释,所以我可以一劳永逸地理解差异,当我应该用什么.
编辑:
#include <stdio.h>
main()
{
char ch[] = "Hello";
char *p1 = ch;
char *p2 = p1;
char *p3 = *p1;
printf("ch : %s\n", ch);
printf("p1 address [%d] value is %s\n", p1, *p1);
printf("p2 address [%d] value is %s\n", p2, *p2);
printf("p3 address [%d] value is %s\n", p3, *p3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)