f**********d 发帖数: 4960 | 1 c里面不允许declare动态长度的array.
但因为我的array的长度是从文件中读入,事先并不知道array的长度。
所以我用以下方法:
float *MyArray = malloc(sizeof(float) * N); // N为array的长度的变量
for (i = 0; i < N; ++i)
{
MyArray[i] = Seg[i]; // Seg[N]为array内容的array.
}
但是这样做之后,sizeof(MyArray)为4,也就是一个float的长度。而如果指定N为常数
,比如2。
那么sizeof(MyArray)长度就是8。
两个问题:我这样定义事先不知道长度的array的方法是否正确,如果有问题,那么如
何解决? |
a9 发帖数: 21638 | 2 sizeof是sizeof了指针。你不能这么搞。
你在malloc的时候已经知道长度了啊,不就是sizeof(float)*n吗?
【在 f**********d 的大作中提到】 : c里面不允许declare动态长度的array. : 但因为我的array的长度是从文件中读入,事先并不知道array的长度。 : 所以我用以下方法: : float *MyArray = malloc(sizeof(float) * N); // N为array的长度的变量 : for (i = 0; i < N; ++i) : { : MyArray[i] = Seg[i]; // Seg[N]为array内容的array. : } : 但是这样做之后,sizeof(MyArray)为4,也就是一个float的长度。而如果指定N为常数 : ,比如2。
|
d****n 发帖数: 1637 | 3 //use malloc with realloc
int size = 100;
int used =0;
float * array = malloc(sizeof(float)*);
for (int i=0;i<1000;i++){
if (i>=size){
size*=2
array = (float*)realloc(array,sizeof(float)*size);
}
array[used++] = float(i*100.);
}
free (array) ;
【在 f**********d 的大作中提到】 : c里面不允许declare动态长度的array. : 但因为我的array的长度是从文件中读入,事先并不知道array的长度。 : 所以我用以下方法: : float *MyArray = malloc(sizeof(float) * N); // N为array的长度的变量 : for (i = 0; i < N; ++i) : { : MyArray[i] = Seg[i]; // Seg[N]为array内容的array. : } : 但是这样做之后,sizeof(MyArray)为4,也就是一个float的长度。而如果指定N为常数 : ,比如2。
|
f**********d 发帖数: 4960 | 4 因为之后我要把MyArray作为一个参数传给一个API的函数,
这个API函数没给当Array的长度不是固定的情况的例子。
我不知道像我那么定义函数是否能知道MyArray的长度。
【在 a9 的大作中提到】 : sizeof是sizeof了指针。你不能这么搞。 : 你在malloc的时候已经知道长度了啊,不就是sizeof(float)*n吗?
|
b******7 发帖数: 123 | |
s******y 发帖数: 416 | 6 malloc 长度是比实际需要多一位,这一位标记为零。用这一位做数组结束的标志。
或者就用ls的方法,在设计函数时把实际需要的长度作为参数2传入就可以了。
第二种方法比较好。
【在 f**********d 的大作中提到】 : 因为之后我要把MyArray作为一个参数传给一个API的函数, : 这个API函数没给当Array的长度不是固定的情况的例子。 : 我不知道像我那么定义函数是否能知道MyArray的长度。
|
c******e 发帖数: 545 | 7 你确定你用的是c?你确定你说的不是字符串?
知道array长度没什么好办法,就是要显示声明(单独参数或者struct成员),看看
windows api的例子就行了(比如 GetCurrentDirectory)。
关于sizeof,这个是编译期操作符,不可能得到运行期长度的。
【在 s******y 的大作中提到】 : malloc 长度是比实际需要多一位,这一位标记为零。用这一位做数组结束的标志。 : 或者就用ls的方法,在设计函数时把实际需要的长度作为参数2传入就可以了。 : 第二种方法比较好。
|
d***a 发帖数: 13752 | 8 代码没有问题,可以这样写。你只是要保证分配的空间确实有N个element,否则会有数
组访问溢出。在机器代码层,MyArray[i]的实际意义是*(MyArray+i)。
你不用去管sizeof()的返回值。MyArray是个指针,存放的是内存地址,sizeof(
MyArray)返回的就是指针本身的字节数,在32位机器上就是4个字节。
【在 f**********d 的大作中提到】 : c里面不允许declare动态长度的array. : 但因为我的array的长度是从文件中读入,事先并不知道array的长度。 : 所以我用以下方法: : float *MyArray = malloc(sizeof(float) * N); // N为array的长度的变量 : for (i = 0; i < N; ++i) : { : MyArray[i] = Seg[i]; // Seg[N]为array内容的array. : } : 但是这样做之后,sizeof(MyArray)为4,也就是一个float的长度。而如果指定N为常数 : ,比如2。
|
s******y 发帖数: 416 | 9 哦。是我搞错了。没仔细看。
【在 c******e 的大作中提到】 : 你确定你用的是c?你确定你说的不是字符串? : 知道array长度没什么好办法,就是要显示声明(单独参数或者struct成员),看看 : windows api的例子就行了(比如 GetCurrentDirectory)。 : 关于sizeof,这个是编译期操作符,不可能得到运行期长度的。
|