C语言,怎么用malloc申请一个100000个变量的字符串数组?

大概就是 char m[100000][100] 这样的规模,查了好久还是不会用malloc来申请,所以上来弱弱的问一下..
char *m;
m = (char*)malloc(sizeof(char)*10000000);
是这样申请吗?
然后怎么给他们赋值运算之类的呢?
直接m[0][0]这样会报错..

可以通过以下语句实现:
char *p; //定义指针变量
p = (char *)malloc(100000);//申请空间并赋值给p。
解析:
malloc为内存分配函数,其定义为
void * malloc(size_t size);
功能为申请size大小的内存长度,并返回分配到的地址值。
而字符类型,每个元素占1个字节空间,所以100000个变量的总空间就是100000字节,于是参数size为100000。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-09-08
#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;
}

你申请的是一维的 你想要的是二维的 当然报错

第2个回答  推荐于2018-03-07
这是一个二维数组,所以要定义一个二维指针才能完成相应的操作
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个地址空间,这里来对空间进行赋值,即:分配具体的数据存储空间

本回答被提问者和网友采纳
相似回答