我正在Fortran中编写一个新代码,并且在使用可分配数组或指针数组之间犹豫不决.我在某处读到可分配数组比指针数组有明显优势:
1)效率更高,因为它们在内存中总是连续的
2)没有内存泄漏是可能的
有人能证实吗?你建议使用哪一个?在这两种备选方案之间的代码执行速度方面有什么结果?
arrays fortran pointers memory-management dynamic-memory-allocation
指针如何指向[-1]数组的索引每次都会产生合法的输出.指针赋值实际发生了什么?
#include<stdio.h>
int main()
{
int realarray[10];
int *array = &realarray[-1];
printf("%p\n", (void *)array);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码输出:
manav@workstation:~/knr$ gcc -Wall -pedantic ptr.c
manav@workstation:~/knr$ ./a.out
0xbf841140
Run Code Online (Sandbox Code Playgroud)
编辑:如果这种情况有效,那么我可以用它来定义一个索引从1开始而不是0的数组,即:array [1],array [2],...
我遇到了一些包含如下函数的遗留代码:
LPCTSTR returnString()
{
char buffer[50000];
LPCTSTR t;
/*Some code here that copies some string into buffer*/
t = buffer;
return t;
}
Run Code Online (Sandbox Code Playgroud)
现在,我强烈怀疑这是错误的.我尝试调用该函数,它确实返回了您希望它返回的字符串.但是,我真的不知道这是怎么发生的:是不是char应该存储在堆栈中的数组,因此在函数退出后解除分配?如果我错了,它存储在堆上,这个函数是不是会造成内存泄漏?
关于以下C++程序:
class Base { };
class Child : public Base { };
int main()
{
// Normal: using child as base is allowed
Child *c = new Child();
Base *b = c;
// Double pointers: apparently can't use Child** as Base**
Child **cc = &c;
Base **bb = cc;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
GCC在最后一个赋值语句中产生以下错误:
error: invalid conversion from ‘Child**’ to ‘Base**’
Run Code Online (Sandbox Code Playgroud)
我的问题分为两部分:
reinterpret_cast.使用这些演员表意味着抛弃所有类型的安全.有没有什么我可以添加到类定义中来隐式地转换这些指针,或者至少以允许我使用的方式表达转换static_cast?愚蠢的问题,但每当你打电话给新的时,你总是有指针吗?
SomeClass *person = new SomeClass();
Run Code Online (Sandbox Code Playgroud)
那是因为你需要一个指向指向为SomeClass变量人分配的新内存空间的指针吗?谢谢!
让我们假设我是一个游戏,我有一个int*包含我健康的全局.游戏训练师的工作是将此值修改为任何内容以实现上帝模式.我已经查阅了游戏培训师的教程,以了解它们是如何工作的,一般的想法是使用内存扫描程序来尝试找到某个值的地址.然后通过注入一个dll或其他来修改这个地址.
但是我创建了一个简单的全局程序,int*每次运行应用程序时它的地址都会发生变化,所以我不知道游戏培训师如何对这些地址进行硬编码?或者我的例子错了吗?
我错过了什么?
我看到人们经常编写C代码,例如:
char *ptr = malloc(sizeof(char)*256);
Run Code Online (Sandbox Code Playgroud)
这真的有必要吗?标准说,sizeof(char)==1根据定义,只写这样有意义:
char *ptr = malloc(256);
Run Code Online (Sandbox Code Playgroud)
谢谢,Boda Cydo.
简单的问题,我导入一个DLL函数,参数是int*.当我尝试输入Method(0)时,我收到一条错误,上面写着:"int和int*无法转换".
那是什么意思?
复制包含char数组的两个结构的标准方法是什么?
这是一些代码:
#include stdio.h>
#include string.h>
#include stdlib.h>
typedef struct {
char* name;
char* surname;
} person;
int main(void){
person p1;
person p2;
p1.name = (char*)malloc(5);
p1.surname = (char*)malloc(5);
strcpy(p1.name, "AAAA");
strcpy(p1.surname, "BBBB");
memcpy(&p2, &p1, sizeof(person));
free(p1.name);
printf("%s\n", p2.name);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该行printf("%s\n", p2.name);不打印,因为我释放了缓冲区.
我的结构的问题是它们比struct更大person.它们包含数百个char指针,我必须逐个复制每个成员.
是否有另一种方法来复制包含char数组的两个结构而不使用malloc和strcpy为每个成员?
我有两个指向双打的指针数组,我需要交换.而不是仅仅复制数组中的数据,将指针交换到数组会更有效.我一直认为数组名称本质上只是指针,但以下代码收到编译器错误:
double left[] = {1,2,3};
double right[] = {9,8,7};
double * swap = left;
left = right; // Error "ISO C++ forbids assignment of arrays"
right = swap; // Error "incompatible types in assignment of `double*' to `double[((unsigned int)((int)numParameters))]'"
Run Code Online (Sandbox Code Playgroud)
动态创建数组可以解决问题,但无法在我的应用程序中完成.我该如何工作?