由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - c的问题(2)
相关主题
这个怎么allocate memory?IDL一问
在子函数内开内存,返回主函数指针然后释放空间是不是很糟糕的(转载)请看看这个Perl random sampling code 有什么问题,
c++ template中如何判断类型C array
size不固定的struct怎么定义呀?any good open source memory pool for C
问一个c语言malloc的问题请教改numpy array的dtype
问个程序问题ask a c question
问个hash函数问题关于malloc/free和循环
一个简单的算法问题?数组定义的时候,分配空间了么?
相关话题的讨论汇总
话题: array话题: myarray话题: 长度话题: sizeof话题: float
进入Programming版参与讨论
1 (共1页)
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
5
不知道长度,需要传另外一个长度参数。
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,这个是编译期操作符,不可能得到运行期长度的。

1 (共1页)
进入Programming版参与讨论
相关主题
数组定义的时候,分配空间了么?问一个c语言malloc的问题
初学C,对什么该free一直搞不明白问个程序问题
ask a simple question about int pointer.问个hash函数问题
free(char *)的问题 (转载)一个简单的算法问题?
这个怎么allocate memory?IDL一问
在子函数内开内存,返回主函数指针然后释放空间是不是很糟糕的(转载)请看看这个Perl random sampling code 有什么问题,
c++ template中如何判断类型C array
size不固定的struct怎么定义呀?any good open source memory pool for C
相关话题的讨论汇总
话题: array话题: myarray话题: 长度话题: sizeof话题: float