C中的非空指针是否只关心从其地址到内存空间适合类型的地址的内存空间,或者。。。?
示例:
typedef struct {...} A;
// the allocated memory space is much larger than sizeof(A)
A* temp = (A*) malloc(sizeof(A) + 256 * 256);
char* charPointer = (char*) temp;
charPointer += sizeof(A);
temp = (A*) charPointer;
在最后一行中,temp
是否仍然指向新的"A变量"?(似乎是A分配的数组)
更新:
CCD_ 2中的强制转换声明&初始化将内存空间变成A
的数组,或者内存空间没有"类型",temp
首先占用(大小:sizeof(A)
)内存空间来存储A
变量,其余内存空间什么都不做?
首先,void*
可以隐式转换为任何其他指针类型(提示:malloc
返回的强制转换为值是多余的)。
那么记忆毫无意义,就是你如何解读它的内容,赋予它意义。
因此,您基本上是在分配sizeof(A) + SOME_LENGTH
字节的内存,然后告诉编译器,您希望将从分配的内存开始的特定地址视为A*
。
没有什么可以阻止你这样做,只要从地址开始保留的内存是>= sizeof(A)
,它就会工作。
唯一的问题是如何释放内存。派生地址CCD_ 12不是被标记为CCD_。这意味着以下代码会产生未定义的行为:
void* temp = malloc(sizeof(A) + sizeof(A));
A* ptr = temp + sizeof(A);
free(ptr);
是的,它指向一个"a struct"。分配的内存只有一些字节,用户可以用任何指针类型访问它。
在这些用法中,用户应该注意c中的动态内存分配和指针概念,以避免分段错误问题。
在C中,malloc返回新内存分配的第一个字节的地址。
您必须强制转换它(或者至少将它放在指针类型中)。
根据您的指针类型,如果您递增此地址,它将跳过正确的字节数。
例如:
main.c
int* myPointer = NULL;
mypointer = (int*) malloc(sizeof(int) * 10);
//mypointer is the address of the first int
mypointer++;
//mypointer is now the address of the second int.
他知道指针递增后要跳多少字节,因为他知道指针的类型(int*
)。
int是4字节,所以在内存中,当你增加int*
时,它会进一步增加4个地址。
因此yes它指向A结构,但如果您转换错误的类型,您将出现分段错误,因为它不会增加4(在本例中)。
希望它能有所帮助。