我正在阅读有关C中数组与指针的更多内容,并编写了以下程序。
#include <stdio.h>
int arr[10] = { } ;
typedef int (*type)[10] ;
int main()
{
type val = &arr ;
printf("Size is %lu\n", sizeof(val)) ;
printf("Size of int is %lu\n", sizeof(int)) ;
}
如果我执行此程序,则sizeof(val)
为8,sizeof(int)
为4。
如果val
是指向包含10个元素的数组的指针,那么它的大小不应该为40.为什么sizeof(val)
8?
答案 0 :(得分:3)
如果val是指向数组的指针......
是的,而且SET myFolder D:\temp\img\
TAG POS=4 TYPE=IMG ATTR=SRC:/upload/images/* EXTRACT=HREF
SET !EXTRACT EVAL("'{{!EXTRACT}}'.match(/\/upload\/images\/(.*)image\.jpg/)[1];")
SET !EXTRACT EVAL("'{{!EXTRACT}}'.replace(/\\//g, '\\\\');")
ADD myFolder {{!EXTRACT}}
ONDOWNLOAD FOLDER={{myFolder}} FILE=image.jpg WAIT=YES
TAG POS=4 TYPE=IMG ATTR=SRC:/upload/images/* CONTENT=EVENT:SAVEPICTUREAS
产生&#34; 指针到数组&#34;的大小,而不是数组本身。
...不应该是40岁。
不,sizeof(val)
计算操作数的大小,&#34;指针&#34;这里。在您的平台中,指针的大小似乎是64位,即8字节。所以,它给出了sizeof(val)
。
另外,正如我所提到的,使用8
打印%zu
,size_t
运营商生成的类型。
答案 1 :(得分:3)
首先是数组的初始化
int arr[10] = { } ;
C中的无效。您不能在C中使用emplty括号(在C ++中它们是允许的)。你必须写
int arr[10] = { 0 } ;
在C中,相应的初始化程序按以下方式定义
initializer:
{ initializer-list }
{ initializer-list , }
在C ++中
braced-init-list:
{ initializer-list ,opt }
{ }
至于这句话
printf("Size is %lu\n", sizeof(val)) ;
然后val
是一个指针,因为它的类型type
定义为
typedef int (*type)[10] ;
将此声明更改为
printf( "Size is %zu\n", sizeof( *val ) );
如果你想得到指针指向的对象(即数组)的大小。
答案 2 :(得分:0)
sizeof返回指针本身的大小。在64位系统中,它是8个字节。 指针不知道它们指向的缓冲区大小。
答案 3 :(得分:0)
JavaRDD<Record> data = sc.parallelize(
Lists.newArrayList(
new Record(33, "Jack", "USA"),
new Record(24, "Sam", "USA"),
new Record(24, "Dan", "USA"),
new Record(31, "Jack", "USA")));
JavaRDD<Record> sorted
= data.sortBy(rec -> rec, true, data.partitions().size());
System.out.println(sorted.collect());
//define bean
class Record implements Serializable, Comparable<Record> {
private int age;
private String name;
private String country;
public Record(int age, String name, String country) {
this.age = age;
this.name = name;
this.country = country;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@Override
public int compareTo(Record o) {
int compAge = Integer.compare(this.age, o.age);
if (compAge != 0) return compAge;
else return this.name.compareTo(o.name);
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("age", age)
.append("name", name)
.append("country", country)
.toString();
}
}
是一种不同的数据类型,并且始终具有固定大小。将指针视为指向实际数据的符号,并且符号始终具有相同的大小 - 无论它指向单个字符还是更大的数组。
答案 4 :(得分:0)
val
是指针,其大小等于系统的地址总线大小。
因此,sizeof(val)
或sizeof(anyPointer)
会将8
作为输出。
如果您需要40
,请尝试sizeof(arr)
。
指向数组的指针是简单的指针,您可以在其中编写val++
,而数组名称为constant pointer
则无法编写arr++
。
您还可以查看此link
答案 5 :(得分:0)
很可能你在64 bit
PC中,其中内存地址需要64 bits
或8 byte
空间来表示。
现在pointer
实际上保存了内存地址,而它可能包含int
的地址或int[]
的地址,并不重要。
所以,当你执行时,
printf("Size is %lu\n", sizeof(val)) ;
它显示8
因为指针包含需要64 bits
空格的地址。
并且
printf("Size of int is %lu\n", sizeof(int)) ;
此行只打印int
的大小4
字节。