Dereferencing a character pointer in C
这是我的代码:
1 2
| char *str = malloc(100*sizeof(char));
*str ="Hello"; // or pass it any string |
现在我想在函数中传递str:
系统打开(const char*文件名,int标志,int模式)
当我使用char数组作为第二个参数时,它是有效的,但是使用复制值的指针是无效的。
我可以用一个char数组来实现我想要的,但是为什么我不能用一个指针来实现呢?
- 这段代码甚至不应该编译得很干净。你没有收到警告吗?作为一篇社论,sizeof(char)是1,所以您不需要费心输入额外的字符。
- 第二行是从const char*到char的无效强制转换。
- 我传递sys_open(infilename,"0_rdwr",00700);如果我将字符串literal lile"a.txt"而不是infilename,它将起作用。我的指针坏了。我遇到的问题是,我不知道用户将要传递给我什么名称,所以出于动态目的,我选择了一个指针,因为char数组也不工作。
- 你可以一直使用cx1〔4〕(95个零)
- 显示包含您对sys_open的调用的完整代码。
在C中不能这样分配字符串。您需要使用strcpy(3)或它的一个亲属。
- 是的,*str ="Hello";是一个编译错误,但str ="Hello";是合法的。
- 这只是我机器上的一个警告。incompatible pointer to integer conversion assigning to 'char' from 'char [6]'
- 32位还是64位?
- 我写这封信只是想说明一点。我遇到的实际问题是将它作为参数传递。我知道str有我想要的字符串,因为我在它前面做了一个printf,但是当我通过sys-read时,我得到了一个负fd,但是当我使用char数组时,一切都很好。
- 那么,请显示实际代码。
- 我传递sys_open(infilename,"0_rdwr",00700);如果我将字符串literal lile"a.txt"而不是infilename,它将起作用。我的指针坏了。我遇到的问题是,我不知道用户将要传递给我什么名称,所以出于动态目的,我选择了一个指针,因为char数组也不工作。
- 你为什么要引用O_RDWR?
- 那没什么区别。
- 只是引言中的错误。您所显示的代码并不能让我确信您完全解释了问题。请出示一份完整的SSCC,以便我们更准确地帮助您?
- 卡尔,使用sys-open,我有一个指针指向argv[1],该指针名为str。然后我将str作为参数传递给sys-open。假设argv[1]是"a.txt",当我传递str时,它指向argv[1]不起作用。但是如果要将literal a.txt传递给系统调用,它会起作用,我会得到我想要的。
- 是否必须取消引用str作为参数?
有一些问题:
1
| *str ="Hello"; // or pass it any string |
str是char*,*str是char,"Hello"是const char*(好吧,实际上是const char[6]衰变成const char*。把一个const char*分配给一个char是违法的。
假设您的意思是str ="Hello";,这仍然是错误的,因为它重新分配指针str指向字符串文字"Hello"。您以前分配给malloc的内存现在没有任何指向它的内容,您已经泄漏了内存。
把str传给sys_read是行不通的。str指向的是字符串文字,而不是您分配的可写内存。count不仅是错误的,而且sys_read根本就写不出来。(字符串文本是不可变的,尝试修改一个文本将导致未定义的行为。)
- 我正在使用一个函数,它将argv[1]复制到str中,并且我已经完成了printf以确保str中包含正确的字符串。
- 我传递给系统打开函数的str指针
在程序中,我觉得缺少类型转换,因为malloc返回一个void *并将其分配给char *会产生错误。
- 从其他指针类型到void *和从void *的转换在C中是隐式的。
- 它不是依赖于编译器吗?上述代码未能在没有类型转换的情况下在Visual Studio上编译。
- 不,它不依赖于编译器。您必须使用C++编译器。
- 我如何将str指向argv[1]
- char* str = argv[1];
- 如果指针已经声明了,稍后我要分配给它的代码会怎么样?是str=argv[1]吗?
- 对。6