我正在尝试创建一个链接列表,您可以在其中更新节点中的数据,但无论我尝试什么,C似乎都不允许我更新void指针的值(或者更确切地说它指向的位置) .这是我的测试代码:
void newData(void * d)
{
char data[] = "world";
d = &data;
}
int main()
{
char testData[] = "hello";
void * testPointer = &testData;
printf("TestData is %s\n", (char *)testPointer);
// Modify the data
newData(&testPointer);
printf("TestData is %s\n", (char *)testPointer);
}
Run Code Online (Sandbox Code Playgroud)
哪个只是输出::
TestData is hello
TestData is hello
Run Code Online (Sandbox Code Playgroud)
我错过了一些明显的东西吗?我也尝试使用指针指针,但无济于事.
嘿,我想知道在使软件更安全,更灵活方面如何在现实世界中应用无效指针.例如,我知道void指针,它将向外部隐藏的指针,这将使软件更安全.是否有其他原因可以使用void指针?
我想使用本地指针指向全局字符串.指针是本地指针,字符串是全局的.当我运行此代码时,将本地指针传递给函数"myfun"时,指针不会改变,即其指向地址不会改变.打印的值为"NULL".
谁能告诉我为什么这对gcc不起作用?
#include <stdio.h>
char *str[] = { "String #1", "Another string" };
void myfun( void * p, int i )
{
p = ( void * ) &str[ i ][ 0 ];
}
int main( void )
{
void * ptr1, * ptr2;
myfun( ptr1, 0 );
myfun( ptr2, 1 );
printf( "%s\n%s\n", ptr1, ptr2 );
}
Run Code Online (Sandbox Code Playgroud) 我试图使用指针(特别是一个空指针)按引用编写交换函数,但我的代码不起作用.这是我的代码:
void swap(void *p1,void *p2)
{
int temp;
temp=*((int*)p2);
p2=p1;
p1=&temp;
}
int main()
{
int i=4;
int j=5;
cout<<i<<j<<endl;
swap(&i,&j);
cout<<i<<j<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我哪里错了?
我不明白为什么编译器警告我在这段代码中传递一个不兼容的指针类型:(在这种情况下,void *和之间有什么区别void **)(我不知道这是否有所不同,但我使用的是gnu99C版本)
void someFunc(void ** foo) {
printf("%s\n", *foo);
}
int main() {
char * text = "some text";
someFunc(&text);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
而在这不是
void someFunc(void * foo) {
printf("%s\n", foo);
}
int main() {
char * text = "some text";
someFunc(text);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
提前致谢
我试图通过交换指针的地址来交换任何给定类型的两个值.
我提出的函数在调用任何两个整数时工作正常,但是当在同一范围内定义更多整数时,行为很奇怪(至少对我来说).例如,考虑一下这个SSCCE:
#include <stdio.h>
static inline void exchx(void** a, void** b) { void* p = *a; *a = *b; *b = p; }
int main(void) {
int a = 1;
int b = 2;
int c = 3;
int d = 4;
printf("\nBefore: abcd = %d, %d, %d, %d", a, b, c, d);
exchx((void**)&a,(void**)&b);
printf("\nAfter: abcd = %d, %d, %d, %d\n", a, b, c, d);
}
Run Code Online (Sandbox Code Playgroud)
我希望第二次打印是"2,1,3,4",但我得到了这个:
Before: abcd = 1, 2, 3, 4
After: abcd = 2, 1, 2, …Run Code Online (Sandbox Code Playgroud) 我必须在Linux上的C中编写一个函数来读取或写入通用数据.
我可以读取(或写入)大数据,所以我用了多少字节读了一会儿.例如,在下一次调用i时,读入原始指针+我读取的字节数.但是我不知道这种类型,所以我使用了一个空格*但是gcc说:
membox.c: In function ‘myRW’:
membox.c:301:22: warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith]
w = read(fd, data + (s*type) , len - s);
^
membox.c:308:23: warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith]
w = write(fd, data + (s*type) , len - s);
Run Code Online (Sandbox Code Playgroud)
我能这样做吗?我应该忽略这个警告?
我必须提前确保足够的空间,以便按照任意比例划分两种不同类型的总共4k条目,然后用数据填充它.我以为我会为4k的较大类型分配足够的空间,然后决定用数据填充它实际上是什么类型.我遇到了编译器告诉我错误的问题(etoa:1554):非法类型:ptr-to-void'+'int.
在我的init函数中,我分配这样的空间:
ser_dat_ch = calloc(LABEL_T_CNT,
(sizeof(mpls_vpws_t) > sizeof(mpls_vpls_t)
? sizeof(mpls_vpws_t)
: sizeof(mpls_vpls_t)));
Run Code Online (Sandbox Code Playgroud)
在那里ser_dat_ch被宣布在像这样的文件范围:
static void *ser_dat_ch = NULL;
Run Code Online (Sandbox Code Playgroud)
当我将数据加载到结构中时,我想做类似的事情
rv = switch_mpls_vpws_data_get(lab, (mpls_vpws_t*)&ser_dat_ch[lab]);
Run Code Online (Sandbox Code Playgroud)
,但这就是让编译器对我咆哮的原因.有什么问题?
我有一堆外部C函数在C#中成为这样的东西:
public extern static int clGetDeviceInfo(
IntPtr device,
uint param_name,
IntPtr param_value_size,
void* param_value,
out IntPtr param_value_size_ret);
Run Code Online (Sandbox Code Playgroud)
因为有一堆看似相似的函数,我想创建一个读取这些C函数提供的数据的方法.这就是我的用途:
unsafe public static ErrorCode GetInfoString(
IntPtr handle, uint property,
Func<IntPtr, uint, IntPtr, void*, IntPtr, int> infoFunc,
out string value)
{
// reading logic
}
Run Code Online (Sandbox Code Playgroud)
我的问题是C#不允许我使用它void*作为泛型参数Func.有没有解决这个问题的方法?
我既不能改变外部C函数的签名也不能改变C#函数的签名(我正在使用库).
假设我有一个值:
int i = 0;
Run Code Online (Sandbox Code Playgroud)
并且有资格进行空基优化的空类:
struct Empty{
// stuff that passes
// static_assert( std::is_empty<Empty>::value );
};
Run Code Online (Sandbox Code Playgroud)
是否合法:
Empty& e = *reinterpret_cast<Empty*>(reinterpret_cast<void*>(&i)); //?
// do stuff with e
Run Code Online (Sandbox Code Playgroud) c++ void-pointers is-empty template-meta-programming void-safety