可能重复:
数组名是C中的指针吗?
所以,我通常使用指针声明数组.
但是,您也可以使用方括号表示法声明数组:
char a[] = "ok" ;
char b[] = "to" ;
char *pa = a ;
cout << "a " << sizeof( a ) << endl ; // 3
cout << "pa " << sizeof( pa ) << endl ; // 4
Run Code Online (Sandbox Code Playgroud)
奇怪的是,sizeof( a )将是以字节为单位的数组的实际大小,而不是指针的大小.
我发现这很奇怪,因为指针在哪里呢?方括号声明的数组实际上是一种带(sizeof(char)*numElements)字节的数据结构吗?
此外,您无法将a重新分配给b:
a = b ; // ILLEGAL.
Run Code Online (Sandbox Code Playgroud)
这是为什么?似乎a 是数组而不是指向数组的指针("左操作数必须是l值"是a = b上面的错误).是对的吗?
在Web上的示例中,对CreateThread的调用通常会传递指向struct的指针LPVOID lpParameter,并使用该指针来访问struct本身.
#include <Windows.h>
#include <stdio.h>
struct Point
{
float x,y,z ;
} ;
DWORD WINAPI threadStartPoint( LPVOID data )
{
Sleep( 1000 ) ;
Point *p = (Point*)data ;
printf( "%f %f %f\n", p->x, p->y, p->z ) ;
puts( "Thread job done" ) ;
return 0 ;
}
// From main
int main()
{
DWORD threadId ;
Point p ;
p.x=2, p.y=3, p.z=4 ;
HANDLE handle = CreateThread( 0, 0,
threadStartPoint,
(LPVOID)&p,
0, // ?? …Run Code Online (Sandbox Code Playgroud) 扩展这个问题,我想使用我认为的val,因为它们是"应该"的,
#include <stdio.h>
enum E{ A, B, C } ;
#define inc(enVal) (*((int*)&enVal))++
int main()
{
E t = A ;
inc( t ) ;
printf( "t %d\n", t ) ;
}
Run Code Online (Sandbox Code Playgroud)
现在呃,t是一个枚举类型E的变量,我有一个宏inc,它将值增加t1,
那么这个宏(并且可能是其他用于标记检查的宏)的效率要比使用它的效率低得多int t吗?
之前boost::shared_ptr,从函数返回堆分配指针被认为是一种不好的做法,因为调用者需要记住free()该对象吗?
或者,它被认为是"正常"?
我有一个背后有数学函数的对象.它似乎是一个完美的候选人operator().
特别是它对于球体上的每个(phi,theta)位置具有不同值的光.
现在的问题是,当在类中时,访问light函数具有这种蹩脚的语法:
double operator() ( double phi, double theta )
{
// compute light function
return sin(2*t) * cos(p) ; // (really this is implemented as a function pointer,
// so the light function can be changed)
}
void functionThatUsesLightFunction()
{
double val = ( 2.0, 4.0 ) ; // seems bad // Whoops! Doesn't work.
double val2 = (*this)( 2.0, 4.0 ) ; // ok
double val3 = operator()( 2.0, 4.0 ) ; // no thank … 注意:请取消关于"C++?使用std :: string!"的评论..这个问题是使用C字符串,但更多的是关于内存管理而不是字符串.
我有这个功能
char* strclone( char* src )
{
char* dst = (char*)malloc(strlen(src+1));
strcpy(dst,src);
return dst;
}
Run Code Online (Sandbox Code Playgroud)
该函数应该用于分配新指针(in strclone),将src中的字符串写入其中,并返回新字符串的地址.
但是,当字符串为freed时,稍后在程序中:
str = strclone( some_str_variable );
// ..code..
free( str ) ; //! ERROR!
Run Code Online (Sandbox Code Playgroud)
错误如下:
调试错误!程序:C:\ ...... HEAP CORRUPTION DETECTED:在正常块(#39713)之后的0x090CC448.CRT检测到应用程序在堆缓冲区结束后写入内存.
错误发生在我free( str )在程序中调用的行.如果我将str的赋值更改为:
str = (char*)malloc( strlen( some_string_variable ) +1);
strcpy( str, some_string_variable ) ;
//...
free( str ) ; //fine now
Run Code Online (Sandbox Code Playgroud)
然后没有错误,程序功能完美.
为什么strclone功能不能按预期工作?
当我调用vector<double>::clear()一些大尺寸的矢量时,我看不到内存在任务管理器/性能中返回到系统.
显然这是因为容器希望你再次使用相同的内存.一旦任务完成,我将不会再次使用该内存,并且内存将更好地返回到系统.
有没有一种方法,以确保立即内存返回到系统,比其他使用类似指针vector<double> * v/调用delete上v,当我们想要的记忆又回到了这个系统?
我不确定C++ AMP有什么用处.如果我已经多线程化我的应用程序(在这种情况下,光线跟踪器)来使用系统上的所有n个核心,我应该使用C++ AMP,还是这会产生更多的瓶颈?(当它尝试多线程时,所有CPU核心已经100%使用,)