有什么方法可以找到在此代码中为;WITH a AS(
SELECT *
FROM (VALUES ('name a',0),
('name b',1),
('name c',2),
('name d',3)) x(name, intID))
, b AS(
SELECT *
FROM (VALUES ('day1',0),
('day2',0),
('day3',1),
('day4',0),
('day5',0),
('day6',0),
('day7',3),
('day8',0)) y(Occurrences, intID))
SELECT 'Item #' + CONVERT(nvarchar(10), b.intID) + ' ' + a.name as result
FROM b
INNER JOIN a ON b.intID = a.intID
分配了多少字节
RandomArray
此外,我不知道上面的代码是否会有任何实际用途。但我从编程角度看。
答案 0 :(得分:3)
是的,通过在变量中保存大小:
int main()
{
int *RandomArray;
int n;
srand(time(NULL));
size_t size = rand() % 11;
if(size == 0)
{
fprintf(stderr, "Size 0, no point in allocating memory\n");
return 1;
}
RandomArray = malloc(size * sizeof *RandomArray)
if(RandomArray == NULL)
{
fprintf(stderr, "no memory left\n");
return 1;
}
printf("%zu %zu\n", sizeof(RandomArray), size);
// don't forget to free the memory
free(RandomArray);
return 0;
}
请注意,sizeof(RandomArray)
会返回指向int
的指针的大小
需要存储在内存中,sizeof(*RandomArray)
会返回大小
int
。
另外不要忘记释放记忆。
答案 1 :(得分:3)
啊这是实验性代码。有趣的事情在那里。
N
整数N
在[{1}}至0
之间,包括10
和0
之间分配内存。然后您将10
应用于指针(sizeof
)及其指向的内容(int*
)。你分配多少内存并不重要。此行的输出将相同。
此处没有错误检查。如果它是你无法确定它是否完全成功,因为int
可能会给rand()
结果。您需要将其存储在某处并检查它是否为0
,因为在这种情况下0
可能会或可能不会返回malloc
。
使用NULL
格式说明符打印sizeof
返回的内容。它返回%zu
。
- 更清楚地记得它是一个指向动态分配内存的指针。
size_t
不是数组 - 它是指向连续内存的指针。这不会使它成为阵列。它仍然是一个指针。你想要应用的RandomArray
技巧sizeof
是一个数组是行不通的。一般来说,我们会跟踪它 - 使用一些变量。但是在这里你不知道你分配了多少内存。
RandomArray
传递给它时, malloc
可能会返回NULL
。单独处理该案件。如果您获得0
并在sz!=0
中错误地获取NULL
。
RandomArray
在所有这些讨论之后 - 简短的回答是,使用此设置到目前为止没有使用代码(您编写的代码)。你不知道malloc中那个案例返回的 size_t sz = rand()%11;
RandomArray = malloc(sz);
if(!RandomArray && sz){
perror("malloc");
exit(EXIT_FAILURE);
}
是什么。
答案 2 :(得分:2)
由于表达式*RandomArray
的类型为int
,sizeof(*RandomArray)
的计算结果为sizeof(int)
。它没有告诉你分配了多少内存。
在动态分配内存时,您需要跟踪自己分配的内容。在上面的例子中,您需要将随机数存储在某个位置,以便知道该数量是多少。
答案 3 :(得分:0)
sizeof(RandomArray)
分配的字节数, RandomArray
总是会产生4个字节(等于指针大小)
/* Since its implimentation dependent, so I'm not
advising you to access RandomArray[-1], also proper type casting needed */
printf("memory allocated = %d \n",RandomArray[-1]);
来自
Denis Ritchie撰写的C编程语言& Kernighan的
typedef long Align; /* for alignment to long boundary */
union header { /* block header */
struct {
union header *ptr; /* next block if on free list */
unsigned size; /* size of this block */
} s;
Align x; /* force alignment of blocks */
};
typedef union header Header;
永远不会使用Align
字段; 它只会强制每个标题在最坏情况边界上对齐。
在malloc
中,请求的字符大小向上舍入为正确数量的标题大小的单位;要分配的块包含
另一个单位,对于header
本身,这是记录在中的值
标题的size
字段。
malloc返回的指针指向可用空间,而不是标题本身。
RandomArray[-1]
-----------------------------------------
| | SIZE | |
-----------------------------------------
RandomArray
-> a block returned by malloc
答案 4 :(得分:0)
sizeof
运算符在编译时工作,但操作数为可变长度数组且动态内存分配为运行时操作的情况除外。
在表达式中:
printf("%d %d",sizeof(RandomArray),sizeof(*RandomArray));
RandomArray
的类型为int *
,*RandomArray
的类型为int
。
因此,表达式相当于:
printf("%d %d",sizeof(int *),sizeof(int));
sizeof
将结果作为整数常量生成,因此,无论分配给RandomArray
的内存大小如何,每次都会得到相同的结果。
How to find the size of dynamic array
从您动态分配内存的位置跟踪 size 。
请注意,在分配内存时,您将rand()%11
返回的值乘以sizeof *RandomArray
,rand()
也可能返回0
,这将导致malloc(0)
}。很高兴知道(来自C Standards#7.22.3):
....如果请求的空间大小为零,则行为是实现定义的:要么返回空指针,要么行为就像大小是非零值一样,除了返回的指针应该不能用来访问对象。