C语言,怎么用malloc申请一个100000个变量的字符串数组?
大概就是charm[100000][100]这样的规模,查了好久还是不会用malloc来申请,所以上来弱弱的问一下..char*m;m=(char*)malloc(siz...
大概就是 char m[100000][100] 这样的规模,查了好久还是不会用malloc来申请,所以上来弱弱的问一下..
char *m;
m = (char*)malloc(sizeof(char)*10000000);
是这样申请吗?
然后怎么给他们赋值运算之类的呢?
直接m[0][0]这样会报错.. 展开
char *m;
m = (char*)malloc(sizeof(char)*10000000);
是这样申请吗?
然后怎么给他们赋值运算之类的呢?
直接m[0][0]这样会报错.. 展开
3个回答
展开全部
可以通过以下语句实现:
char *p; //定义指针变量
p = (char *)malloc(100000);//申请空间并赋值给p。
解析:
malloc为内存分配函数,其定义为
void * malloc(size_t size);
功能为申请size大小的内存长度,并返回分配到的地址值。
而字符类型,每个元素占1个字节空间,所以100000个变量的总空间就是100000字节,于是参数size为100000。
char *p; //定义指针变量
p = (char *)malloc(100000);//申请空间并赋值给p。
解析:
malloc为内存分配函数,其定义为
void * malloc(size_t size);
功能为申请size大小的内存长度,并返回分配到的地址值。
而字符类型,每个元素占1个字节空间,所以100000个变量的总空间就是100000字节,于是参数size为100000。
展开全部
#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
// 申请的arr空间类似: #代表point *代表data; 那么他就是一个 4行5列的数据
// #***** #***** #***** #***** //这是本来应该存储的形态
// ####***** ***** ***** ***** //这是我们写出来的结构 那么解释一下
// 第一个# 即头指针arr, 第二个# 他指向了第第二组的头 即第二行的首元素 第三个#指向了第三行的首元素 第四个#同理
// head即第一个*的位置
// 二维数组 arr[i][j] 等价于 * ( arr + i ) + j; 又等价于 arr[i] + j; ( 此处arr[i]代表地址 )
template < typename TYPE >
TYPE ** new_Array_2D( int row, int col ) //row是行 col是列
{
int data_size = sizeof( TYPE ); //一个数据的空间
int point_size = sizeof( TYPE * ); //一根指针的空间
TYPE ** arr = ( TYPE ** ) malloc( point_size * row + data_size * row * col ); //申请了能存储列指针和所有数据空间的空间
if( arr != NULL ) //申请成功
{
TYPE * head = ( TYPE * )( arr + row ); //head指针指向数据开始位置的指针
for( int i = 0; i < row; i++ )
{
arr[i] = ( TYPE * )( ( int ) head + i * col * data_size ); //把arr[i]设置为指向行首地址的指针
for( int j = 0; j < col; j++ )
{
new ( & arr[i][j] ) TYPE; //T是指对arr[i][j]调用其构造函数 & arr[i][j]这个地地址会作为构造函数中this指针的内容
} // this指针即为date -> func() 等价于 func( &date ), 隐含传递了this;
} // 现在arr[i][j] 的地址即为这个数据的指针
}
return ( TYPE ** ) arr; //返回这个数组头指针
}
template < typename TYPE >
void delete_Array_2D( TYPE ** arr, int row, int col ) //释放二维数组 row行 col列
{
for( int i = 0; i < row; i++ ) //遍历整个数组
{
for( int j = 0; j < col; j++ )
{
arr[i][j].~TYPE(); //调用arr[i][j]的析构函数
}
}
if( arr != NULL )
{
free( ( void ** ) arr ); //删除整个arr数组 void代表任何类型...
}
}
int main()
{
cout << "请输入行列: ";
int nRow, nCol;
cin >> nRow;
cin >> nCol;
string ** p = new_Array_2D< string >( nRow, nCol ); //动态申请连续的二维数组
for( int i = 0; i < nRow; i++ ) //为二维数组赋值
{
for( int j = 0; j < nCol; j++ )
{
char szTemp[30];
sprintf_s( szTemp, "<第%d行,第%d列>", i, j );
p[i][j] = szTemp;
}
}
for( int i = 0; i < nRow; i++ ) //输出二维数组
{
for( int j = 0; j < nCol; j++ )
{
cout << p[i][j] << " ";
}
cout << endl;
}
delete_Array_2D< string >( p, nRow, nCol ); //释放内存
system( "pause" );
return 0;
}
你申请的是一维的 你想要的是二维的 当然报错
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这是一个二维数组,所以要定义一个二维指针才能完成相应的操作
char **m ;
m = (char**)malloc(sizeof(char *) * 100000); //行数
int i=0;
for( i=0;i<100000 ;i++ )
{
m[i]= (char*)malloc(sizeof(char)*100); //为每行申请空间
}
接下来,就和使用二维数组一样的操作m了,如:
strcpy( m[0], "hello" );
m[0][0]= 'H' ;
char **m ;
m = (char**)malloc(sizeof(char *) * 100000); //行数
int i=0;
for( i=0;i<100000 ;i++ )
{
m[i]= (char*)malloc(sizeof(char)*100); //为每行申请空间
}
接下来,就和使用二维数组一样的操作m了,如:
strcpy( m[0], "hello" );
m[0][0]= 'H' ;
追问
m = (char**)malloc(sizeof(char *) * 100000);
m[i]= (char*)malloc(sizeof(char)*100);
可以用了谢谢哈.
能解释一下这两行的差异所在吗?主要是第一行申请的是怎么样的空间呢?
追答
一维指针(普通指针)用来存储内存地址,通过地址,来访问数据
二维指针,分两级,第一级中存储的是地址,第二级中存储的还是地址,通过第一级中的地址,找到的内容是第二级的地址,通过第二级的地址,可以访问到数据。
m = (char**)malloc(sizeof(char *) * 100000);//分配100000个地址究竟,注意类型是char**,表示这些地址用来存储的是char*类型地址
m[i]= (char*)malloc(sizeof(char)*100); //前面分配了100000个地址空间,这里来对空间进行赋值,即:分配具体的数据存储空间
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询